全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域局限於一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
以下舉例說明:
1.創建一個名為StaticGlobal的win32 console c++工程
2.在工程里面添加文件A.cpp, 復制以下代碼到A.cpp
static int i = 0; static void Func() { cout<<i<<endl; } void FuncA() { Func(); } int iG = 0; void FuncG() { }
3.在工程里面添加文件B.cpp, 復制以下代碼到B.cpp
static int i = 1; static void Func() { cout<<i<<endl; } void FuncB() { Func(); } int iG = 0; void FuncG() { }
4.復制以下代碼到StaticGlobal.cpp
void Func(); void FuncA(); void FuncB(); int _tmain(int argc, _TCHAR* argv[]) { Func(); FuncA(); FuncB(); return 0; }
5.Build工程,將得到以下Linker errors
1>B.obj : error LNK2005: "void __cdecl FuncG(void)" (?FuncG@@YAXXZ) already defined in A.obj
1>B.obj : error LNK2005: "int iG" (?iG@@3HA) already defined in A.obj
1>StaticGlobal.obj : error LNK2019: unresolved external symbol "void __cdecl Func(void)" (?Func@@YAXXZ) referenced in function _wmain
第1個error是因為FuncG是一個全局函數,在整個程序中都可見,A.cpp里面已經定義了FuncG,B.cpp里面重復定義引起沖突。
第2個error是因為iG是一個全局變量,在整個程序中都可見,A.cpp里面已經定義了iG,B.cpp里面重復定義引起沖突。
第3個error是因為Func是靜態全局函數,其只在定義它的文件中有效即A.cpp和B.Cpp,在StaticGlobal.cpp中不可見。
6.注釋掉以上錯誤代碼,build通過運行結果如下:
0 1