gpt4 book ai didi

c++ - 为什么这是一个最终递归可变参数宏?

转载 作者:太空狗 更新时间:2023-10-29 23:03:13 25 4
gpt4 key购买 nike

以下构造在 VisualStudio 2013 中编译。我刚刚创建了一个新的 consoleApplication 项目并且只更改了主要的 .cpp,因此您可以粘贴它并尝试一下。它显然所做的是创建一个最终递归可变参数宏。

#include "stdafx.h"
#include <iostream>
using namespace std;

#define DEFINE_ENUM_VALUE(name, i) name = i,
#define _DEFINE_ENUM_VALUES(i, name, ...) DEFINE_ENUM_VALUE(name, i+1)
#define DEFINE_ENUM_VALUES(enum_name, name, ...) enum class enum_name{ \
DEFINE_ENUM_VALUE(name, 0) _DEFINE_ENUM_VALUES(1, __VA_ARGS__) \
};

DEFINE_ENUM_VALUES(names, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9)

int _tmain(int argc, _TCHAR* argv[])
{
cout << (int)names::_0 << ' ';
cout << (int)names::_1 << ' ';
cout << (int)names::_2 << ' ';
cout << (int)names::_3 << ' ';
cout << (int)names::_4 << ' ';
cout << (int)names::_5 << ' ';
cout << (int)names::_6 << ' ';
cout << (int)names::_7 << ' ';
cout << (int)names::_8 << ' ';
cout << (int)names::_9 << ' ';
return 0;
}

这不仅可以编译,而且几乎可以像人们想象的那样工作。输出是这样的:

0 1 2 3 4 5 6 7 8 2

不是拼写错误,names::_9 的值是 2。对于像这样定义的每个枚举都是这种情况,最后一个值总是 2。我用 3-15 个参数的整个范围测试了它。

有人知道这里发生了什么吗?

为什么 MSVC 预处理器扩展 DEFINE_ENUM_VALUE多次?为什么,如果它是预期的行为(我对此表示怀疑),为什么它会使最后一个值 2?

我还用 ideone 测试了它,它确实无法按预期编译,注意到 names::_1 之后的所有内容不是 names 的一部分.

最佳答案

即使这是无稽之谈,正如克里斯所说,这已被标记为 "won't fix"并且还会影响 MSVC Update4(在撰写本文时)

Hi: I can confirm that this is a bug with Visual C++. Unfortunately it does not meet the triage bar for the current release of Visual C++ - but we will keep the issue in our database and we will look at it again during the development phase of a future release of Visual C++.

Jonathan CavesVisual C++ Compiler Team

为了发布相关摘录,__VA_ARG__ 参数在 _DEFINE_ENUM_VALUES 宏中被替换时,被视为单个标记而不是多个因此输出

enum class names{ _0 = 0, _1, _2, _3, _4, _5, _6, _7, _8, _9 = 1+1, };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this is a single token
for MSVC

代替

enum class names{ _0 = 0, _1 = 1 +1, };

这在做类似的事情时可能并不明显

#define printf_macro(format_string, ...) printf(format_string, __VA_ARGS__)

但在上面的示例中变得很明显。

关于c++ - 为什么这是一个最终递归可变参数宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26464843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com