外部如何工作?
extern
是C中的存储类。它究竟是如何工作的? 下面给出的代码输出是20.这是如何输出的?
#include int main() { extern int a; printf("%d", a); return 0; } int a=20;
这意味着三件事:
- 该变量具有外部链接 ,可从程序中的任何位置访问;
- 它有静态存储持续时间 ,因此它的生命周期是程序的生命周期(或多或少); 和
- 声明只是一个声明,而不是一个定义。 变量也必须在某处定义(没有
extern
,或者使用初始化,或者在你的情况下,两者都定义)。
具体来说,你的extern int a;
声明该变量存在,但不会在该点定义它。 此时,您可以使用它,链接器将确保您的使用引用定义。 然后你有了所需的定义, int a=20;
最后,一切都很好。
在这种情况下, extern
表示符号a
在不同的位置定义,例如不同的模块。 因此,链接器在所有链接的模块中查找具有相同名称的符号,如果存在,则将地址设置为本地变量a
,并将地址设置为外部定义的变量。 由于main()
函数有另一个定义的外部, main()
函数内部的a
(基本上)与外部的变量相同。
由于全局a
在main函数执行之前被初始化,因此在您访问它时该值为20。
extern意味着我声明一个变量,就像在源文件中实现一个函数一样,并在头文件中声明原型以允许其他源文件使用它。
如果将全局变量放在源文件中,并使用标头使用extern关键字声明它,则包含标头的每个源文件都将看到该变量。
链接器将完成工作,就像处理函数一样
extern
作为存储类说明符告诉编译器声明的对象不是新对象,但在其他地方有存储,即在其他地方定义。 您可以尝试使用代码进行此实验,以了解其工作原理。 在main()
的int a
声明中省略关键字extern
。 然后你的printf()
将打印一些垃圾值,因为它将是具有相同标识符的int
的新定义,这将隐藏在其他地方声明的全局a
。
您使用extern
告诉编译器该变量是在别处定义的。 如果程序中没有extern
,编译器会在main()
函数中定义另一个未初始化的变量a
(除了在全局范围内)。