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

Compare two undefinded symbols in C

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

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

你能解释一下为什么吗?对标准有任何参考吗?

编译器不会捕捉到您的 MACRO 未定义,而是将其视为 0。 由于 0 == 0 printf 将被执行。

C 标准说所有未定义的标识符都被替换为 0。

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

After all replacements due to macro expansion and the defined unary operator have been performed, all remaining identifiers (including those lexically identical to keywords) are replaced with the pp-number 0, and then each preprocessing token is converted into a token. The resulting tokens compose the controlling constant expression which is evaluated ...

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

你还应该检查是否都定义了,我认为如果两个(任何)都未定义,你不需要编译。

#if defined(SYMBOL1) && defined(SYMBOL1) && (SYMBOL1==SYMBOL2)
printf("Hello World");
#endif

(完全未经测试,但大概的想法)。

编辑:另见 Preprocessor check if multiple defines are not defined