最近在学习c编程时,我注意到了一些我觉得有趣的东西。我曾经读过像int i=0;
这样的语句是强制定义的唯一方法,而像extern int i;
这样的语句意味着强制声明。像int i;
这样的语句将取决于上下文。但是当我将extern与extern int i=13;
之类的初始化结合起来时会发生什么。编译器生成警告。但这条规则是什么呢?
答案 0 :(得分:5)
这是编码样式警告 对此的论证是代码是有效的,但对于C来说非常单一,因为“extern”通常被认为意味着声明不提供对象的定义。
extern int i=13;
声明并定义i
,而:
extern int i;
只声明变量i
。
GCC上已经提出了具体的 bug 45977 ,但它仍然显示未确认状态。
错误报告指出代码在语法上符合C标准。它有一个讨论,详细讨论了这一点。
Standerdese粉丝:
相关章节参考文献:
ansi c99标准6.2.2:标识符的链接和
ansi c99标准6.9.2.4
答案 1 :(得分:4)
声明变量时,只需将名称绑定到该变量即可。
定义变量时,为其保留内存。
当你将变量声明为extern时,你告诉编译器“这是在其他地方定义的,并且在链接时可用”,所以可以使用它。
答案 2 :(得分:0)
如果要从不同程序访问特定变量,则使用Extern。由于您在程序中没有任何定义,因此编译器会给您一个错误。
答案 3 :(得分:0)
在C中,定义只是一个恰好分配存储的声明(无论是因为它有一个初始化器,还是因为它是一个用作定义的暂定定义)。所以,你可以对声明做的一切(比如指定它有extern
存储),你也可以做一个定义。
请注意,这与C ++不同。