C++ static全局變量與全局變量的區別/static全局函數與全局函數的區別


全局變量(外部變量)的說明之前再冠以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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM