2013-04-29 49 views
-1

因为我们知道变量的extern声明可以被初始化。变量的双重定义

#include<stdio.h> 

extern int a=5; //will work as both definition and declaration. 
int main() 
{ 

} 

为什么这个程序是编译和无差错运行。

extern int a=5; //will work as both definition and declaration. 
int main() 
{ 

} 

int a; // isn't it second definition?? 
+0

大概有http://stackoverflow.com/questions/3095861/about-tentative-definition做 – Kos 2013-04-29 17:30:05

+0

感谢@Kos,这个线程是非常丰富的,我没有在我的搜索中找到它:( – user2333014 2013-04-29 17:39:36

+0

也相关:http://stackoverflow.com/questions/1490693/tentative-definitions-in-c99-and-linking – 2013-04-29 18:00:44

回答

4

C有一个“暂定义”的概念。大多数没有初始化的定义是“暂定的”,所以只要它们不相互冲突,就允许任意数量的定义。在翻译单元结束时,变量的定义基本上成为那些(复合例如,如果一个定义,说的变量是const而另一个说,这是volatile,变量将最终成为双方constvolatile

有一个初始化的定义是从来没有试探性的,所以只有一个是允许的。

+0

哪些声明说明符可以在临时定义之间有所不同? cv-qualifiers,存储说明符(extern,static?),还有什么? – Kos 2013-04-29 17:41:04