GCC如何处理变量重定义

时间:2015-05-26 10:27:42

标签: c++ c gcc g++

我写了一段像这样的代码

int a;
int a = 100;
int main()
{
}

GCC 成功编译,但不是由 G ++ 编译。

我猜GCC通过忽略变量a的第一个定义来处理这个问题。但我想知道确切的规则,以便我不会错过任何事情。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:10)

在C

int a;  /* Tentative definition */
int a = 100; /* Definition */

来自C11规范中的 6.9.2外部对象定义

  

具有文件范围的对象的标识符声明   没有初始值设定项,没有存储类说明符或带有   存储类说明符static,构成暂定   定义即可。如果翻译单元包含一个或多个暂定单元   标识符的定义,翻译单元包含 no   该标识符的外部定义,然后行为完全正确   好像翻译单元包含一个文件范围声明   标识符,在翻译结束时使用复合类型   单位,初始化程序等于0。

int i4; // tentative definition, external linkage
static int i5; // tentative definition, internal linkage

在C ++中

int a;是一个定义(非暂定的),因为对象的多个定义是非法的,所以不会编译。