外部如何工作?

时间:2013-08-26 17:41:34

标签: c++ c extern

extern是C中的存储类。它究竟是如何工作的?下面给出的代码输出为20.这是如何输出的?

#include <stdio.h>

int main()
{
    extern int a;
    printf("%d", a);
    return 0;
}
int a=20;

5 个答案:

答案 0 :(得分:10)

这意味着三件事:

  • 该变量具有外部链接,可从程序中的任何位置访问;
  • 它具有静态存储持续时间,因此它的生命周期是程序的生命周期(或多或少);和
  • 声明只是一个声明,而不是一个定义。变量也必须在某处定义(没有extern,或者使用初始化,或者在你的情况下,都是)。

具体来说,您的extern int a;声明该变量存在,但不会在该点定义它。此时,您可以使用它,链接器将确保您的使用引用定义。然后你得到了所需的定义,最后是int a=20;,所以一切都很好。

答案 1 :(得分:3)

在这种情况下,

extern表示符号a在不同的位置定义,例如不同的模块。因此,链接器在所有链接的模块中查找具有相同名称的符号,如果存在,则将地址设置为本地变量a,其地址为外部定义的变量。由于您在a函数之外定义了另一个main(),因此a函数中的main()(基本上)与外部函数相同。

由于全局a在main函数执行之前被初始化,因此在您访问它时该值为20。

答案 2 :(得分:2)

extern意味着我声明一个变量,就像在源文件中实现一个函数一样,并在头文件中声明原型以允许其他源文件使用它。

如果将全局变量放在源文件中,并使用标头用extern关键字声明它,则包含标题的每个源文件都将看到该变量。

链接器将完成所有工作,就像处理函数一样

答案 3 :(得分:2)

extern作为存储类说明符告诉编译器声明的对象不是新对象,但在其他地方有存储,即在别处定义。您可以尝试使用代码进行此实验,以了解其工作原理。在extern的{​​{1}}声明中省略关键字int a。然后你的main()将打印一些垃圾值,因为它将是具有相同标识符的printf()的新定义,这将隐藏在其他地方声明的全局int

答案 4 :(得分:1)

使用extern告诉编译器变量是在别处定义的。如果程序中没有extern,编译器将在a函数中定义另一个未初始化的变量main()(除了全局范围内的此变量)。