4

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

#include <stdio.h>

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

5 回答 5

12

这意味着三件事:

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

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

于 2013-08-26T18:16:38.173 回答
4

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

由于全局a是在主函数执行之前初始化的,所以在您访问它时该值是 20。

于 2013-08-26T17:51:26.043 回答
3

extern means i declare a variable, just like you implement a function in a source file and declare the prototype in a header to allow other source file to use it.

If you put a global variable in a source file, and use a header to declare it with the extern keyword, each source file including the header will see the variable.

The linker will do the job to tie everything just as it does with functions

于 2013-08-26T17:48:20.783 回答
3

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

于 2013-08-26T17:54:31.360 回答
2

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

于 2013-08-26T17:44:46.370 回答