0

__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 做某事。

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

4

1 回答 1

4

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

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

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

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

回答您评论中的问题:

现在,在使用这些标头编译代码一年多之后,我是否必须更改所有代码?

是的,这正是我要说的。您对的使用__G一直不正确;你只是碰巧直到现在还没有遇到任何明显的症状。

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

于 2014-06-20T01:27:17.930 回答