__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/