GCC如何处理变量重定义

How does GCC handle variable redefinition

本文关键字:变量 定义 处理 何处理 GCC      更新时间:2023-10-16

我写了一段这样的代码

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

GCC编译成功,但 g++ 编译失败。

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

有谁能帮我吗?

In C

int a;  /* Tentative definition */
int a = 100; /* Definition */
6.9.2 C11规范中的外部对象定义:

具有文件作用域的对象的标识符声明不带初始化式,不带存储类说明符或带存储类说明符static,构成一个暂定定义。如果翻译单元包含一个或多个试探性一个标识符的定义,翻译单元包含no外部定义该标识符,则该行为是准确的就好像翻译单元包含了它的文件作用域声明标识符,在转换结束时具有复合类型单元,初始化式等于0。

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

在c++

int a;是一个定义(不是试探性的),因为拥有一个对象的多个定义是非法的,所以它将无法编译。