为什么在以下代码中满足#if条件:
#include <iostream>
#define VALUE foo
int main() {
#if VALUE == bar
std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
所有宏扩展后,对defined和__has_include进行评估(自C ++ 17起)表达式,不是布尔值的任何标识符文字被替换为数字``0''(包括标识符是词汇上的关键字,但不是替代标记,如and)。
因此foo
和bar
都被替换为0。
在#if
语句中,宏替换后剩余的所有标识符(true
和false
除外)都将被常量0
替换。所以你的指令变成
#if 0 == 0
是的。
这是因为foo
和bar
都没有给出任何定义或值-因此它们是相同的。编译器将对此发出警告。
MSVC
编译器(Visual Studio 2019)提供以下内容:
警告C4668:'foo'未定义为预处理器宏,替换为带有“ 0”的警告C4668:“ bar”未定义为预处理器宏,用“ 0”代替“#if /#elif”
因此VALUE
的值为'0'(foo
的默认值),bar
的值为'0',因此VALUE == bar
的值为“ TRUE”。