non-local-static 变量,包括global对象、定义于namespace作用域内的对象,classes内、以及在file作用域内被声明为static的对象,不包括在函数内的static变量。由于c++对不同编译单元non-local-static 变量的初始化顺序没有规定,如果这些non-local-static变量之间存在相互依赖,则被依赖的变量可能没有完全初始化。如
//Month.h class Month { public: ~Month(void); static Month Jan; static Month Feb; explicit Month(int a); int val; }; //Month.cpp #include "Month.h" Month Month::Feb(2); Month Month::Jan(1); Month::Month(int a):val(a) { } Month::~Month(void) { } //MonthTest.h #include "Month.h" class MonthTest { public: MonthTest(void); ~MonthTest(void); Month month; }; //MonthTest.cpp #include "MonthTest.h" MonthTest::MonthTest(void):month(Month::Feb) { } MonthTest::~MonthTest(void) { } MonthTest m_test; //main extern MonthTest m_test ; int _tmain(int argc, _TCHAR* argv[]) { cout << m_test.month.val <<endl; getchar(); return 0; }
输出结果0。
说明Month::Feb并未初始化。因为Month::Feb和m_test都是non-local-static变量,定义在不同的编译单元中,而m_test依赖于Month::Feb,而Month::Feb并未初始化,这样的程序存在风险。
怎么办,把non-local-static 变量变为local-static变量,并返回该变量,需要变量时调用函数即可,如下
static Month Jan() { return Month(1); } static Month Fet() { return Month(2); }
总之,一句话,所有的static变量(包括全局变量)全部放在函数内定义,即都定义为local-static变量。non-local-static变量没有存在的必要。