static關(guān)鍵字,有兩個(gè)作用:
1) 作用于局部變量,定義該變量的存儲(chǔ)方式,就是我們常常說的靜態(tài)局部變量。
2) 作用于用于模塊內(nèi)聲明的變量和函數(shù),用于指示其可見性。
先談?wù)勛兞亢秃瘮?shù)的可見性。在默認(rèn)的情況下,模塊內(nèi)聲明的變量和函數(shù)是全局可見的,如下:
//Test1.cpp
struct {
int m;
} test;
//Test2.cpp
struct {
int m;
} test;
BUILD的結(jié)果會(huì)報(bào)"multiply defined symbols found"
如果想避免這樣的錯(cuò)誤,需要使用static關(guān)鍵字。
不過好像如果你使用typedef,就不會(huì)出現(xiàn)這樣的錯(cuò)誤。
//Test1.cpp
typedef struct {
int m;
} test;
//Test2.cpp
typedef struct {
int m;
} test;
或者:
//Test1.cpp
typedef struct {
int m;
} test;
//Test2.cpp
typedef int test;
關(guān)于這一點(diǎn),我想可能是typedef的作用域是限定在模塊內(nèi)的,所以沒有這個(gè)問題。這個(gè)使用VC和使用GCC都沒問題,不過我沒有查到官方的文檔。
最后一點(diǎn),想說的是,關(guān)于static變量的生命周期。一般來說:static聲明的變量初始化,只是在程序運(yùn)行的第一次被執(zhí)行。不過有例外,那就是如果該變量定義在dll內(nèi),那么該變量的初始化工作是在dll被裝載時(shí)執(zhí)行,在這種情況下,程序雖然只運(yùn)行一次,但是該靜態(tài)變量可能會(huì)被初始化好幾次(與dll被裝載的次數(shù)有關(guān)). 這個(gè)問題本質(zhì)上是:static聲明的變量的生命周期與包含它的組件相關(guān)。從這個(gè)意義上,我們可以說,static變量在不同的包含組件(EXE或DLL)上表現(xiàn)出不同行為,移植能力差,容易造成BUG,這樣的BUG也不容易發(fā)現(xiàn)。我們在開發(fā)程序的時(shí)候,不可能去假設(shè)該靜態(tài)變量是被包含在什么樣的組件里。我想,這也是一個(gè)不鼓勵(lì)使用static變量的一個(gè)重要原因。