0 c variables external declaration definition
a)外部变量的定义与局部变量的定义相同,即int i=2;(仅在所有函数之外).但为什么extern int i=2;这个定义过于有效呢?是否extern仅用于其他文件中的变量声明?
b)文件1
#include<stdio.h>
int i=3;
int main()
{
printf("%d",i);
fn();
}
Run Code Online (Sandbox Code Playgroud)
文件2
int i; // although the declaration should be: extern int i; So, why is this working?
void fn()
{
printf("%d",i);
}
Run Code Online (Sandbox Code Playgroud)
输出:两种情况均为3
由于历史原因,确定链接的规则以及声明提供定义的时间有点混乱.
对于您的特定示例,在文件范围
extern int i = 2;
Run Code Online (Sandbox Code Playgroud)
和
int i = 2;
Run Code Online (Sandbox Code Playgroud)
是等效的外部定义,即extern如果您提供初始化程序,则是可选的.
但是,如果您不提供初始化程序,extern则不是可选的:
int i;
Run Code Online (Sandbox Code Playgroud)
是一个外部联系的暂定定义,它成为一个外部定义相当于
int i = 0;
Run Code Online (Sandbox Code Playgroud)
如果翻译单元不包含具有显式初始化程序的另一个定义.
这不同于
extern int i;
Run Code Online (Sandbox Code Playgroud)
这绝不是一个定义.如果已经有另一个相同标识符的声明可见,那么变量将从中获得它的链接; 如果这是第一个声明,变量将具有外部链接.
这意味着在你的第二个例子中,file1和file2都提供了一个外部定义i,这是未定义的行为,链接器可以自由选择它最喜欢的定义(它也可能试图让恶魔飞出你的鼻子).对C有一个共同的扩展(参见C99附件J.5.11和这个问题),这使得这个特殊情况得到了明确的定义.