以下构造在 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
This is not拼写错误,其值names::_9
是 2。对于像这样定义的每个枚举都是这种情况,最后一个值始终是 2。我用 3-15 个参数的整个范围进行了测试。
有人知道这里发生了什么事吗?
为什么 MSVC 预处理器要扩展DEFINE_ENUM_VALUE
多次?如果这是预期的行为(我对此表示怀疑),为什么它会使最后一个值变为 2?
我还用 ideone 对其进行了测试,它确实未能按预期编译,注意到之后的所有内容names::_1
不属于names
.