比较两个undefinded符号c .



我没有同时定义符号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检查是否有多个定义

相关内容

  • 没有找到相关文章

最新更新