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

Jan*_*egg 6 c++ gcc clang visual-c++ 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;
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio中显示Bar disabled!,同时在gccclang显示中运行相同的代码Bar enabled!.

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

cpp*_*ner 8

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

[cpp.cond],强调我的

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