将exam1.cpp的第二行int n改为extern int n,这就是告诉程序我在此处声明了变量n,但是真正的定义过程在别的文件中,此处就是exam2.cpp。但事实上exam2.cpp中仅仅声明了static int n。我们看看运行结果。vc中会通过编译,但是在进行连接时候会给出一个“变量n找不到”的错误。这说明exam1.cpp无法共享exam2.cpp中的static int n变量。
是这样的,假如文件 a.c 中有全局变量 int a = 2,文件 b.c 中有全局变量 int b = a + 1。各自编译后,连接器无法决定哪个变量先初始化。我们希望当然是先初始化a,然后初始化b,而实际情况b的值是未定义的。
一个解决办法就是用到函数的静态成员:
在a.c中写一个函数 int get_a() {static int a = 2; return a;}
在b.c中改成 int b = get_a() + 1;
这样能解决问题是因为系统初始化 b 的时候要调用函数get_a(),而该函数的静态成员一定会在函数第一次调用的时候初始化,因此 b 就正确的被初始化为 a + 1.