运行以下代码
#include <iostream>
#define FOO
#define BAR defined(FOO)
int main() {
#if BAR
std::cout << "BAR enabled!" << std::endl;
#else
std::cout << "BAR disabled!" << std::endl;
#endif
return 0;
}
Visual Studio中的显示Bar disabled!
,同时在gcc或clang中运行相同的代码会显示Bar enabled!
。
这是Microsoft编译器中的错误吗?根据标准,什么是正确的?
答案 0 :(得分:8)
根据标准,这是未定义的行为。
[cpp.cond],强调我的
在评估之前,将替换将成为控制常量表达式的预处理标记列表中的宏调用(由
defined
一元运算符修改的宏名称除外),就像在普通文本中一样。 如果由于此替换过程而生成了令牌defined
,或者在更换宏之前使用defined
一元运算符与两个指定表单中的一个不匹配,< strong>行为未定义。