全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
以下举例说明:
1.创建一个名为StaticGlobal的win32 console c++工程
2.在工程里面添加文件A.cpp, 复制以下代码到A.cpp
static int i = ;
static void Func()
{
cout<<i<<endl;
} void FuncA()
{
Func();
} int iG = ;
void FuncG()
{
}
3.在工程里面添加文件B.cpp, 复制以下代码到B.cpp
static int i = ;
static void Func()
{
cout<<i<<endl;
} void FuncB()
{
Func();
} int iG = ;
void FuncG()
{
}
4.复制以下代码到StaticGlobal.cpp
void Func();
void FuncA();
void FuncB(); int _tmain(int argc, _TCHAR* argv[])
{
Func();
FuncA();
FuncB();
return ;
}
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通过运行结果如下: