理解C中的`extern`存储类说明符

考虑给定的C代码:

#include extern int i; int main(){ printf("%d", i); return 0; } 

它给出了Compilation error 。 如果我初始化extern int i=10; 然后输出是10

 #include extern int i=10; //initialization statement int main(){ printf("%d", i); return 0; } 

而且,如果我指定int i=10; 然后输出是10

 #include extern int i; int i=10; //assignment int main(){ printf("%d", i); return 0; } 

 #include extern int i; int main(){ int i=10; //assignment printf("%d", i); return 0; } 

变化:

 #include extern int i; int i=20; int main(){ int i=10; printf("%d", i); return 0; } 

因为, int i是局部变量,所以输出为10

请您解释一下有关C中extern存储类的重要观点


我在某处读到,声明声明了变量或函数的名称和类型。 定义导致为要定义的函数的变量或主体分配存储。 相同的变量或函数可能有很多声明,但该变量或函数只能有一个定义。

考虑

 int i; 

在程序的所有function之外声明,包括main

这意味着i将拥有

  • 文件范围
  • 静态存储持续时间
  • 为i分配空间。 #这个很重要。

考虑

 extern int i; 

在程序的所有function之外声明,包括main
这意味着i将拥有

  • 文件范围
  • 静态存储持续时间
  • i只是声明,没有定义,这意味着没有分配空间。
  • i假设在其他地方定义,可能是在包含文件中

考虑

 extern int i=10; 

在程序的所有function之外声明,包括main
这是您初始化extern变量i 。 在这种情况下

  • i分配空间。
  • 我将初始化为10
  • 关键字extern被忽略,这意味着i declared onlydeclared only

注意

对于extern int i ,必须在其他地方定义变量,即在另一个源文件中定义。 如果不是这种情况,则会出现编译时错误。

extern存储类说明符用于提供对所有程序文件可见的全局变量的引用。 当您使用’extern’时,无法初始化变量,但是它将变量名称指向先前已定义的存储位置。

当代码通过extern修饰符引用符号时,它表示符号实际上是在别处而不是在当前文件中定义的。

例外情况,如果extern修饰符用于当前文件中实际定义的符号,则可以。

extern int i; 声明只是告诉编译器在某个地方(在这个或另一个源中)存在全局范围内的i的实际声明。 它本身并不是i的实际宣言。 因此,在该声明中为i赋值是不合适的(这就是为什么第二次尝试无效)。 您的第一次尝试无效,因为您没有i的实际声明。

你的第三个是好的,因为你有一个i的实际声明,但你不需要extern int i; 宣言。

您的最后一个样本涉及i在本地和全球范围内。 在这种情况下,将使用本地范围中的变量。 这就是为什么你不打印20。