MSVC未正确评估定义(VARIABLE)?

时间:2016-07-13 15:00:04

标签: c++ gcc visual-c++ clang c-preprocessor

运行以下代码

#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!,同时在gccclang中运行相同的代码会显示Bar enabled!

这是Microsoft编译器中的错误吗?根据标准,什么是正确的?

1 个答案:

答案 0 :(得分:8)

根据标准,这是未定义的行为。

[cpp.cond],强调我的

  

在评估之前,将替换将成为控制常量表达式的预处理标记列表中的宏调用(由defined一元运算符修改的宏名称除外),就像在普通文本中一样。 如果由于此替换过程而生成了令牌defined ,或者在更换宏之前使用defined一元运算符与两个指定表单中的一个不匹配,< strong>行为未定义。