我编写了以下3 C源文件来测试extern关键字 在C:
的main.c
MyHelpers.foo
main2.c
#include<stdio.h>
extern int var;
int main()
{
var = 10;
printf("%d %p",var,&var);
var = 20;
}
other.c
#include<stdio.h>
extern int var;
int main()
{
printf("%d %p",var,&var);
}
我分别编译了两个文件main.c和main2.c,但也链接了 每个
的other.c文件在运行第一个程序时,我得到以下输出: 10 0x8049660
但是在运行第二个之后,我得到了这个: 0 0x8049660
很明显,这两个var指的是同一个地址 使用extern关键字的重点。
但为什么它又被初始化为0?
此外,如果我运行第二个程序而不运行第一个程序,我得到 相同的输出。
为什么会这样?
答案 0 :(得分:3)
关键字extern
不是用于在不同程序之间共享变量,也不是用于在同一程序的连续运行之间共享变量。声明为extern
的变量只表示此变量在同一程序的另一个转换单元中定义,并且此变量的值仅在此程序运行中共享。
请注意,other.c
和main.c
是两个与相同的程序相关联的翻译单元,例如main.exe
。在main.exe
的一次运行中,var
的值将在other.c
和main.c
之间共享,地址将相同。对于main.exe
的第二次运行,您可能会收到不同的地址,即&var
与第一次运行时的值不同。