比较 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
我没有同时定义符号 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