2.全局變量的初始化 關(guān)于全局變量的初始化,c語言和c++是有區(qū)別的。在c語言中,只能用常數(shù)對(duì)全局變量進(jìn)行初始化,否則編譯器會(huì)報(bào)錯(cuò)。在c++中,如果在一個(gè)文件中定義了int a = 5;... 對(duì)于不同編譯單位的全局變量,其初始化的順序沒有任何的保證,因此對(duì)不同編譯單位里的全局變量,在它們的初始化順序之間建立依賴性都是不明智的。 此外也沒辦法捕捉到全局變量初始化拋出的異常,一般來說要減少全局變量的使用,特別是限制那些要求復(fù)雜初始化的全局變量。so: 1,盡量不用全局變量 2,用靜態(tài)變量,通過訪問器進(jìn)行訪問 例如:全局變量 int a = 5; int b = a; 如果a,和b定義在同一個(gè)文件里,那沒什么問題,結(jié)果b等于5. 如果a和b定義在不同文件里,就不能保證b也等于5,也就是說不能保證a先初始化. 事實(shí)上,除了在同一個(gè)文件定義的全局對(duì)象的初始化是按照定義次序來進(jìn)行的之外,其他全局或靜態(tài)變量之間的初始化次序沒有任何保障。解決這種問題的方法是不直接使用全局變量,而改用一個(gè)包裝函數(shù)來訪問,例如 int get_a() { static int a = 5; return a; } int get_b() { static int b = get_a(); return b; }
關(guān)于全局變量的初始化,C語言和C++是有區(qū)別的。 在C語言中,只能用常數(shù)對(duì)全局變量進(jìn)行初始化,否則編譯器會(huì)報(bào)錯(cuò)。 在C++中,如果在一個(gè)文件中定義了int a = 5;要在另一個(gè)文件中定義int b = a;的話,前面必須對(duì)a進(jìn)行聲明:extern int a;否則編譯不通過.、即使是這樣,int b = a;這句話也是分兩步進(jìn)行的:在編譯階段,編譯器把b當(dāng)作是未初始化數(shù)據(jù)而將它初始化為0;在執(zhí)行階段,在main被執(zhí)行前有一個(gè)全局對(duì)象的構(gòu)造過程,int b = a;被當(dāng)作是int型對(duì)象b的拷貝初始化構(gòu)造來執(zhí)行。 其實(shí),準(zhǔn)確地說,在C++中全局對(duì)象、變量的初始化是獨(dú)立的,如果不是象int a = 5;這樣的已初始化數(shù)據(jù),那么就是象b這樣的未初始化數(shù)據(jù)。 而C++中全局對(duì)象、變量的構(gòu)造函數(shù)調(diào)用順序是跟聲明有一定關(guān)系的,即在同一個(gè)文件中先聲明的先調(diào)用。對(duì)于不同文件中的全局對(duì)象、變量,它們的構(gòu)造函數(shù)調(diào)用順序是未定義的,取決于具體的編譯器。作者: pcbcopy 時(shí)間: 2012-1-10 16:13
來占座的。。。