全局變量只有靜態一種類別。對於全局變量可使用extern和static兩種說明符。
全局變量是在函數外部任意位置上定義的變量,它的作用域是從變量定義的位置開始,到整個源文件結束止。
全局變量的使用相當於為函數之間的數據傳遞另外開辟了一條通道。全局變量的生存期是整個程序的運行期間。若全局變量和某個函數中的局部變量同名,則在該函數中,此全局變量被屏蔽,在該函數內訪問的是局部變量,與同名的全局變量不發生任何關系。
雖然全局變量作用域較大,生存期長,用起來似乎方便靈活,但需要注意的是:除十分必要外,一般不提倡使用全局變量,原因主要有以下三方面:
(1)不論是否需要,全局變量在整個程序運行期間都占用內存空間;
(2)全局變量必須在函數以外定義,降低了函數的通用性,影響了 函數的獨立性。
(3)使用全局變量容易因疏忽或使用不當而導致全局變量中的值意外改變,產生難以查找的錯誤。
當全局變量定義在後,飲用它的函數在前時,應該在飲用它的函數中用extern對此全局變量進行說明,以便通知編譯程序:該變量是一個已在外部定義了的全局變量,已經分配了存儲單元,不需再為它另外開辟存儲單元。這時其作用域從extern說明處起,延伸到該函數的末尾。
注意:全局變量的說明與全局變量的定義不同。變量的定義(開辟存儲單元)只能出現一次,在定義全局變量時,不可使用extern說明符;而對全局變量的說明,則可以多次出現在需要的地方,這時必須用extern進行說明。
int x, y; /*定義全局變量的格式*/
extern int x, y; /*說明全局變量的格式*/
實際應用中,一個c程序通常由許多函數組成,這些函數可以分別存放在不同的源文件中,每個源文件可以單獨進行編譯,進行語法檢查,若無錯誤即生成目標文件(.obj),然後可用系統提供的鏈接程序把多個目標文件鏈接成一個可執行程序(.exe)。通常把每個可進行單獨編譯的源文件成為“編譯單位”。
當一個程序由多個編譯單位組成,並且在每個文件中均需要飲用同一個全局變量,這時若在每個文件中都定義一個所需的同名全局變量,則在“鏈接”時將會產生“重復定義”錯誤。這種情況下,單獨編譯每個文件時並無異常,編譯程序將按定義分別為它們開辟存儲空間,而當進行連接時,就會顯示錯誤信息,指出同一變量名進行了重復定義。
解決上述問題的辦法通常是:在其中一個文件中定義所有全局變量,而在其他用到這些全局變量的文件中用extern對這些變量進行說明,聲明這些變量已在其他編譯單位中定義,通知編譯程序不必再為它們開辟存儲單元。
當用static說明符說明全局變量時,此變量可稱為“靜態”全局變量。靜態全局變量只限於本編譯單位,不能被其他編譯單位所引用。static說明限制了全局變量作用域的擴展,達到了信息隱蔽的目的。這對於編寫一個具有眾多編譯單位的大型程序是十分有益的,程序員不必擔心因全局變量重名而引起混亂。