GCC要求#define' s中的下划线?

时间:2016-11-25 11:42:35

标签: c gcc c-preprocessor

我正在测试相同代码的两个版本(在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
}

是的,我甚至使用&#34;无论什么&#34;从字面上看 - 我不认为,它在其他地方被定义。但同样,它是使标签发挥作用的下划线。

2 个答案:

答案 0 :(得分:0)

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

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

我同意这是一个令人困惑和令人沮丧的问题。有一些奇怪的事情发生了,但无论解释是什么,并不是gcc要求领先的下划线。

答案 1 :(得分:-1)

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

<强>具体地:

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

(2)我(无意识地)使用&#34; gcc *&#34;编译了标题。代替&#34; gcc * .c&#34;

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

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

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