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

时间:2016-07-09 10:34:44

标签: c extern

考虑给定的C代码:

#include<stdio.h>
extern int i;
int main(){
    printf("%d", i);
    return 0;
}

它给出了Compilation error。如果我初始化extern int i=10;,则输出为10

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

此外,如果我指定int i=10;,则输出为10

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

并且

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

变化:

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

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

  
    

请您解释一下关于{C

extern存储类的重要观点   

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

4 个答案:

答案 0 :(得分:4)

考虑

int i;

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

这意味着i将有

  • 档案范围
  • 静态存储时间
  • 为i分配空间。 #这很重要。

考虑

extern int i;

在该计划的所有功能之外宣布,包括main 这意味着i将有

  • 档案范围
  • 静态存储时间
  • i仅被声明,未定义,表示未分配空间。
  • 假设
  • i在其他地方定义,可能在包含文件
  • 中定义

考虑

extern int i=10; 

在该计划的所有功能之外宣布,包括main 在这种情况下,您需要初始化extern变量i。在这种情况下

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

注意

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

一个例外,如果extern修饰符用于当前文件中实际定义的符号,那就没问题。

答案 3 :(得分:0)

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

你的第三个没问题,因为你有i的实际声明,但你不必拥有extern int i;声明。

您的最后一个示例涉及本地和全球范围内的i。在这种情况下,将使用局部范围中的变量。这就是你不打印的原因。