(a)若程式由一個源檔案構成時,全局變量與全局靜态變量沒有差別。
(b)若程式由多個源檔案構成時,全局變量與全局靜态變量不同:全局靜态變量使得該變量成為定義該變量的源檔案所獨享,即:全局靜态變量對組成該程式的其它源檔案是無效的。
靜态全局變量的作用:
(a)不必擔心其它源檔案使用相同變量名,彼此互相獨立。
(b)在某源檔案中定義的靜态全局變量不能被其他源檔案使用或修改。
例如:一個程式由兩個源檔案組成,其中在一個源檔案中定義了“int n;”,在另一個源檔案中定義了“static int n;”則程式給它們分别配置設定了不同的空間,兩個值互不幹擾。
例如:下面在file1.cpp中聲明全局變量n,在file2.cpp中定義全局靜态變量n。檔案file1.cpp和file2.cpp單獨編譯都能通過,但連接配接時,file1.cpp中的變量n找不到定義,産生連接配接錯誤。
// file1.cpp
# include <iostream.h>
void fn()
extern int n;
void main()
{
n=20;
cout<<n<<endl;
fn();
}
// file2.cpp
static int n; // 預設初始化為0,注意此處定義的n 隻能在file2.cpp中使用。
n++;
靜态函數:使某個函數隻在一個源檔案中有效,不能被其他源檔案所用。
定義:在函數前面加上static。
說明:函數的聲明和定義預設情況下在整個程式中是extern的。
(1)它允其他源檔案建立并使用同名的函數,而不互相沖突。
(2) 聲明為靜态的函數不能被其他源檔案所調用,因為它的名字不能得到。
拙見:
靜态變量和函數一般都局限于一個編譯單元也就是.cpp檔案中。
我想這是最主要的差別。