【问题标题】:GCC requiring underscore in #define's?GCC 在#define 中需要下划线吗?
【发布时间】:2016-11-25 11:42:34
【问题描述】:

我正在测试相同代码的两个版本(在 Linux 上使用 GCC 版本 4.9.2,无参数)。

两者都有一个#define 指令,后面跟着一个#ifdef/#endif 对。

现在,事实证明,只有在初始 #define 之后的标签以下划线开头时,该组合才能正常工作。没有下划线,它会以一种非常奇怪的方式工作......只有每三次。

换句话说,这是可行的

#define _whatever

虽然不是这样:

#define whatever

尽管我知道如何使指令起作用,但只是好奇——这种行为是否符合任何标准?

编辑: 按照下面的要求,这里有两个绝对真实的例子。 这一个打印“预处理器工作”行:

#define _whatever
#include <stdio.h>
void main()
{
#ifdef _whatever
printf("Preprocessor works \n");
#endif
}

...这个不输出任何东西:

#define whatever
#include <stdio.h>
void main()
{
#ifdef whatever
printf("Preprocessor works \n");
#endif
}

是的,我什至在字面上使用“随便”这个词——我不认为,它是在其他任何地方定义的。但同样,使标签起作用的是下划线。

【问题讨论】:

  • 您没有显示代码中有效或停止工作的部分。
  • 好,实例:
  • 这两个例子都可以正常工作。
  • @Lundin:他们应该这样做。只是不是在我非常具体的情况下....

标签: c gcc c-preprocessor


【解决方案1】:

在任何已知版本的 gcc 中,绝对没有要求预处理器宏以下划线开头。

作为一般规则,以下划线的各种组合开头的预处理器宏保留给实现,建议用户忽略它们。所以#define whatever#ifdef whatever 绝对必须工作。

我同意这是一个令人费解和令人沮丧的问题。发生了一些奇怪的事情,但无论解释是什么,并不是 gcc 需要前导下划线。

【讨论】:

    【解决方案2】:

    好的,所以答案是 - 我对工具的草率命令。

    具体来说:

    (1) 我使用头文件来添加/删除#define 指令

    (2) 我已经(无意识地)使用“gcc *”代替“gcc *.c”来编译标题

    (3) 编译后的 *.h.gch 文件的偶尔出现解释了结果。

    所以,看似不稳定的行为实际上是我(无意识地)不时删除 *.h.gch。

    谢谢大家 - 我从所有回复中学到了很多。

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2019-10-14
      相关资源
      最近更新 更多