什么" __ G"表示?

时间:2014-06-20 01:04:29

标签: 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。

我无法在任何标题中找到它。

1 个答案:

答案 0 :(得分:4)

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

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

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

允许C实现(编译器,链接器,头文件或库)以任何方式定义__G。显然这就是你遇到的。

在回答评论中的问题时:

  

现在,在用这些标题编译代码一年多之后,我是否需要更改我的代码?

是的,这正是我所说的。您对__G的使用始终不正确;到目前为止,你恰好没有遇到任何明显的症状。

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