下面的代码片段工作正常
extern int i;
int i;
int main(){
return 0;
}
我得到的是,'i' 被声明然后定义。由于只有一个定义,所以完全没问题。
int main(){
extern int i;
int i;
return 0;
}
现在,上面的给出了以下错误
new.cpp: In function ‘int main()’:
new.cpp:5:6: error: redeclaration of ‘int i’
int i;
^
new.cpp:4:13: note: previous declaration ‘int i’
extern int i;
这里有什么问题吗?这里也有“i”的单一定义。
要理解其中的差异,您需要熟悉一个概念,称为暂定定义在C中。引用C标准:
C11,草案,§6.9.2,外部对象定义
具有文件范围的对象的标识符声明
没有初始化器,并且没有存储类说明符或带有
存储类说明符 static,构成暂定
定义。如果翻译单元包含一个或多个暂定
标识符的定义,并且翻译单元不包含
该标识符的外部定义,那么行为正是
就好像翻译单元包含该文件范围声明
标识符,具有翻译结束时的复合类型
单位,初始值设定项等于 0。
第一个片段中的内容只是一个暂定定义i
。对于一个对象,您可以有任意多个临时定义(但只允许一个定义):
int i; // tentative definition
int i; // tentative definition
int i; // tentative definition
int main(void) {
return 0;
}
已验证。
Here, i
具有外部链接并暂定。如果i
被定义在同一个翻译单元的某个地方,那么这将是实际的定义i
。如果没有其他定义i
在翻译单元中找到,那么这将成为完整的定义,就好像它的定义如下:
int i = 0;
int main(void) {
return 0;
}
但第二个片段int i;
is not一个暂定的定义。只能暂时定义具有外部链接的对象。在第二个片段中,声明extern int i;
says i
在其他地方通过外部链接定义。但下一行int i;
says i
定义时没有链接(局部自动变量没有任何链接——这是not暂定定义)。所以存在定义冲突i
。因此,第一个片段很好,但第二个片段则不然。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)