在C语言中,声明和定义的区别是什么?

8

最近在学习C编程时,我注意到了一些有趣的事情。我曾经读过这样的内容,像 int i=0; 这样的语句是唯一强制定义的方式,而像 extern int i; 这样的语句则意味着强制声明。而像 int i; 这样的语句则取决于上下文。但是当我将 extern 和初始化结合起来使用,例如 extern int i=13;,编译器会生成警告。但是这个规则是什么呢?


参见:https://dev59.com/dlzUa4cB1Zd3GeqP34A3 - ninjalj
4个回答

5

这是一条编码风格警告
其原因是代码虽然合法,但在C语言中极不符合惯例,因为“extern”通常被认为是声明不提供对象定义。

extern int i=13;  

声明并定义i,同时:

extern int i;      

仅声明变量i

在GCC上提出了一个特定的45977号错误,但仍显示未经确认状态。

该错误报告指出,代码在C标准上是语法正确的。并且有一次讨论详细讨论了这个问题。


对于Standerdese Fans:
相关章节参考资料为:
ANSI C99标准6.2.2:标识符的链接性
ANSI C99标准6.9.2.4


4

当你声明一个变量时,你只是给它绑定了一个名称。

当你定义一个变量时,你为它保留了内存。

当你将一个变量声明为extern时,你告诉编译器“这个变量在别处已经被定义,在链接时会可用”,所以可以使用它。


我同意你刚才说的一切,但是像 extern int i=13; 这样的语句也会分配空间。我的问题是为什么? - Bazooka
@parminder:请查看我上面更新的答案,它会为你的疑问提供一些可信的内容。 - Alok Save
当你声明为 extern 并进行“初始化”时,你只是向其中写入一个值,覆盖了定义它的外部代码放置在那里的任何内容 - 这不是正确的说法。 - jpalecek
@jpalecek:你说得对。其他评论和Als的回答进一步澄清了问题。我已经删除了错误的部分。感谢纠正。 - Emilio M Bumachar

0

如果你想从不同的程序中访问特定的变量,可以使用Extern。由于你的程序中没有对该变量进行定义,因此编译器会报错。


你的回答完全没有抓住重点,OP并不是在寻求解决链接错误的方法,而是在询问为什么编译器会对一个语法上有效的语句发出警告。 - Alok Save

0
在C语言中,定义只是一个分配存储空间的声明(无论是因为它有一个初始化器,还是因为它是一个作为定义使用的试探性定义)。因此,您可以对声明执行的所有操作(例如指定它具有extern存储)也可以对定义执行。
请注意,这与C++不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接