GCC如何处理变量重定义

del*_*rst 9 c c++ gcc g++

我写了一段这样的代码

int a;
int a = 100;
int main()
{
}
Run Code Online (Sandbox Code Playgroud)

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

我猜GCC通过忽略变量a的第一个定义来处理这个问题.但我想知道准确的规则,这样我就不会错过任何东西.

谁能帮我吗?

Moh*_*ain 10

在C.

int a;  /* Tentative definition */
int a = 100; /* Definition */
Run Code Online (Sandbox Code Playgroud)

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

具有没有初始化程序的文件范围且没有存储类说明符或存储类说明符为静态的对象的标识符声明 构成暂定定义.如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元的结尾,初始化程序等于0.

int i4; // tentative definition, external linkage
static int i5; // tentative definition, internal linkage
Run Code Online (Sandbox Code Playgroud)

在C++中

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