外部变量声明和定义

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

Chr*_*oph 5

由于历史原因,确定链接的规则以及声明提供定义的时间有点混乱.

对于您的特定示例,在文件范围

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和这个问题),这使得这个特殊情况得到了明确的定义.