【问题标题】:Compare two undefinded symbols in C比较 C 中的两个未定义符号
【发布时间】:2021-11-25 12:59:29
【问题描述】:

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

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

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

【问题讨论】:

  • “猫头鹰不是他们看起来的样子”
  • 它本质上等同于#if (0 == 0),这是真的。
  • 这肯定是重复的。我们是否有任何规范的“#if 是如何工作的?”发帖?
  • @Lundin 也许你可以用this 欺骗,但它在技术上被标记为 [c++](尽管公认的答案同时引用了 C 和 C++ 标准)。

标签: c c-preprocessor


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    编译器不会发现你的 MACRO 是未定义的,它会认为它是 0。 由于 0 == 0 printf 将被执行。

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

    【讨论】:

      【解决方案3】:

      您还应该检查两者是否都已定义,我认为如果两者(任何)都未定义,则无需编译。

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

      (完全未经测试,但一个粗略的想法)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多