0

可能重复:
在 C 中允许重定义,但在 C++ 中不允许?

#include<stdio.h>
int i;
int i;
int main()
{
        // int i;
        // int i;
        printf("%d\n",i);
        return 0;
}
~          

上面的代码运行没有给出任何错误gcc -Wall -Werror demo.c -o demo

但是当我取消注释local i变量时global i,它会给我错误。

In function ‘main’:
demo.c:7:6: error: redeclaration of ‘i’ with no linkage
demo.c:6:6: note: previous declaration of ‘i’ was here

这里的本地全局概念是什么?,任何人都请解释一下。

4

2 回答 2

2

在 C99 中(更具体地参见第 6.2 节),全局声明默认具有外部链接(6.2.2§5)。在那种情况下(6.2.2§2), i 的两个声明都引用同一个对象。相反,局部变量没有链接(6.2.2§6),因此应该引用唯一标识符(同样是 6.2.2§2):因此,您最终会在相同的范围,这是不允许的(6.2.1§5:由相同标识符指定的不同实体要么具有不同的范围,要么位于不同的名称空间中

于 2012-11-08T17:51:05.927 回答
1

如果所有定义都同意(都具有相同的类型)并且变量在不超过一个位置初始化,则您可以在全局范围内拥有多个变量定义。

J.5.11 多个外部定义

一个对象的标识符可能有多个外部定义,无论是否显式使用关键字 extern;如果定义不一致,或者不止一个被初始化,则行为未定义(6.9.2)。

于 2012-11-08T17:43:29.293 回答