我写了一段像这样的代码
int a;
int a = 100;
int main()
{
}
由 GCC 成功编译,但不是由 G ++ 编译。
我猜GCC通过忽略变量a的第一个定义来处理这个问题。但我想知道确切的规则,以便我不会错过任何事情。
任何人都可以帮助我吗?
答案 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;
是一个定义(非暂定的),因为对象的多个定义是非法的,所以不会编译。