比较 C 中两个未定义的符号

Hob*_*_io 0 c c-preprocessor

我没有定义符号 SYMBOL1 和 SYMBOL2,当我看到以下代码中调用 printf 时,我感到很惊讶:

#include <stdio.h> 
int main()
{
#if (SYMBOL1==SYMBOL2)
    printf("Hello World");
#endif
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您能解释一下原因吗?有什么参考标准吗?

pax*_*blo 5

根据 ISO C 标准 ( C11 6.10.1 Conditional inclusion):

在执行完所有由于宏扩展和定义的一元运算符引起的替换后,所有剩余的标识符(包括词法上与关键字相同的标识符)都被替换为 pp-number 0,然后将每个预处理标记转换为标记。生成的标记组成了计算的控制常量表达式...

换句话说,你的表达式变成了0 == 0,这显然是正确的。因此,它printf包含在源流中。