c - GCC 需要在#define 中使用下划线吗?

标签 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
}

是的,我什至从字面上使用“无论”这个词 - 我不认为它在其他任何地方都有定义。但同样,正是下划线使标签发挥作用。

最佳答案

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

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

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

关于c - GCC 需要在#define 中使用下划线吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40804244/

相关文章:

windows - mingw-w64 线程 : posix vs win32

C语言 : source file after preprocessing

c - 使用#define-d 列表作为 C 预处理器宏的输入

c - 使用 fscanf 和 fprintf 更新文件

c - 有没有办法让迭代器每 3 次操作增加一次?

c - 错误: invalid operands to binary >> (have 'float' and 'int' )

c++ - 数组初始化宏

c++ - C/C++ 中的函数调用宏

c++ - 在 gcc linux 中编译时出现一堆错误和警告

使用 MATLAB 引擎和 g++ 的 C++ 源代码编译