我没有同时定义符号SYMBOL1和SYMBOL2,当我看到printf在以下代码中被调用时,我感到很惊讶:
#include <stdio.h>
int main()
{
#if (SYMBOL1==SYMBOL2)
printf("Hello World");
#endif
return 0;
}
你能解释一下为什么吗?有没有提到标准?
根据ISO C标准(C11 6.10.1 Conditional inclusion
):
在所有由于宏扩展和定义一元的替换之后操作符已经执行,所有剩余的标识符(包括那些词法上与关键字相同的标识符)都被替换为pp-number 0,,然后将每个预处理令牌转换为令牌。生成的令牌组成控制常量表达式,该表达式被求值…
换句话说,你的表达式变成了0 == 0
,这显然是真的。因此,printf
包含在源流中。
编译器不会捕捉到你的宏是未定义的,它会认为它是0。因为0 == 0printf
将被执行
C标准规定所有未定义的标识符都用0替换。
您还应该检查两者是否都已定义,我认为如果两者(any)都未定义,则不需要编译。
#if defined(SYMBOL1) && defined(SYMBOL1) && (SYMBOL1==SYMBOL2)
printf("Hello World");
#endif
(完全未经测试,但一个粗略的想法)。
编辑:参见Preprocessor检查是否有多个定义