全局变量在main()前完成初始化(调用构造函数)
在调用构造函数前,全局变量已分配空间,内存全0
多个全局变量的初始化,按照代码编译的顺序
注意:全局变量被访问前可能它还没有调用构造函数初始化。
如果一个项目中,多个dll都用到一个全局变量在共同的lib中,则每个dll都有一个独立的全局变量(地址不同),每个全局变量会初始化。
如下代码,A里面访问了全局变量g_b, 改变全局变量g_a,g_b的顺序 会导致g_b.b的输出结果不同。
如按照A g_a; B g_b 的顺序定义,编译器会先调用A()时,这时g_b还没有调用B(), g_b.b=0,然后赋值 g_b.b=101;
然后调用B(),g_b.b的值被改成1.
#include <istream>
using namespace std;
class B {
public:
int b = 1;
};
extern B g_b;
class A {
public:
int a = 0;
A() {
g_b.b = 101;
}
};
#if 0
B g_b;
A g_a;
#else
A g_a;
B g_b;
#endif
int main() {
printf("g_b=%d\n", g_b); //AB: g_b=1; BA: g_b=101
return 0;
}