c - "__G"是什么意思?

标签 c gcc c11 gcc4.9

__G 在 C 中表示什么?

我正在使用 GCC 4.9。

我正在使用最新的 MinGW 版本。

我正在使用 -std=gnu11 进行编译。

我有以下 C(用 GCC 编译为 C11)代码:

#ifndef __G
#define __G 0
#endif

它编译得很好。

但是现在,在使用最新的 MinGW 进行编译时,我得到以下信息:

In file included from ../common/sysbase/sysbase.h:6:0,
             from Monitor.c:5:
../common/sysbase/sysbase_chk.h:3:13: error: expected ';', ',' or ')' before numeric constant
#define __G 0

compilation terminated due to -Wfatal-errors.

MinGW64 下的 GCC 似乎在使用 `__G 做某事。

我在任何标题中都找不到它。

最佳答案

__G 只是一个标识符。我不知道它的任何标准用法,但由于它以两个下划线开头,因此它保留用于所有目的的实现。这里的“实现”一词指的是 C 编译器和库,而不是您编写的任何代码(除非您自己实现了编译器或 C 标准库的一部分。)

(该标准规定,任何以两个下划线开头,或一个下划线和一个大写字母开头的标识符都保留用于任何用途;任何以下划线开头的标识符保留用于文件范围。参见第 7.1.3 节N1570 C standard draft .)

您不应该在自己的代码中使用它。这样做会导致您的程序行为未定义。

允许 C 实现(编译器、链接器、头文件或库)以其喜欢的任何方式定义 __G。显然这就是您遇到的情况。

在回答您评论中的问题时:

Now, after more than a year compiling codes with those headers, will I have to change aaalll my codes?

是的,这正是我要说的。您对 __G 的用法一直是错误的;您只是碰巧直到现在才遇到任何明显的症状。

(至少可以想象,以前版本的 MinGW 以某种方式定义它,不会导致您的代码无法编译,但可能会导致它行为不端。)

关于c - "__G"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24318524/

相关文章:

c - i386- Sprite -gcc : error: spawn: No such file or directory

c - 让编译器声明并定位调试指针变量

c - C中的DWORD和HANDLE类型有什么区别?

c++ - GDB 无法使用 VS Code 调试正在运行的进程,但可以通过命令行

海湾合作委员会错误: [enum] field declared as a function

c - 如何使用新的 char16_t 和 u8 类型?

c - lex 解析器解析用 pascal 编写的程序

c++ - 崇高文本 3 中的 ISO C++ 错误禁止可变长度数组

c++ - 类成员偏移地址不正确

c - C中的原子结构?