2012-11-08 209 views
0

可能重复:
Redefinition allowed in C but not in C++?C中的这个双声明是什么意思?

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

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

但是,当我取消对locali变量注释掉globali ,它给了我错误。

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 

这是什么在这里的本地全球概念?,任何人请解释。

+0

它给您带来了什么错误? – Mansfield

+0

为什么downvoted .. ?? – Omkant

回答

1

如果所有定义都一致(全部具有相同类型)并且该变量在不多于一个位置初始化,则可以在全局范围内对变量进行多个定义。

J.5.11多个外部定义

可能有一个对象的标识符,具有或不具有明确使用关键字的extern的多于一个的外部定义;如果定义不一致,或者多于一个被初始化,则行为是不确定的(6.9.2)。

2

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