C語言關鍵字淺析-extern
阿新 • • 發佈:2018-11-23
### C語言關鍵字淺析系列 ###
### ISO/ANSI C 關鍵字 ###
extern的本意是external,是C語言5個儲存類中
外部儲存類(external storage class)的簡寫,這個型別的特徵是一種具有外部連結的靜態變數,
且具有檔案作用域、外部連結和靜態儲存時期
該型別的變數又稱為外部變數(external variable)
extern的作用是:
作為外部儲存類的標誌,定義或宣告外部變數。
1、外部變數的使用
其實外部變數更為常見的一個稱呼可能是全域性變數
即便我們不是每次要寫一個全域性變數的時候都刻意地加上了extern這頂帽子,就像auto一樣
但有些時候extern有更能表現自己存在的意義的地方
比如下面這個demo.c檔案:
#include <stdio.h> /* 本檔案中定義的外部變數和陣列 注意此處是在“定義”外部變數 */ int maxTemp; float temp[31]; /* 另一個檔案中定義的外部變數,本檔案需要用 注意此處extern的作用是“宣告”外部變數,該宣告必須有extern */ extern int maxHumi; void fun(void); int main(void) { extern int maxTemp; /* 可選宣告,表示該函式要用這個變數,extern可省略,但可作為一種標記 */ extern float temp[]; /* 可選宣告,但此處無需再指定陣列長度,因為不是定義 */ /* extern int minTemp; 如果要使用本檔案中函式本身不在其作用域的外部變數,可以聲明後使用,此外部變數作用域將從宣告處開始 */ } int minTemp; /* 該外部變數沒有在檔案頭部定義,故該外部變數的作用域是此處到檔案末尾,即main函式不可見該變數 */ void fun(void) { /* 如果此函式中不寫extern宣告,其實也可以使用可見的外部變數 */ }
2、作用域注意
如果需要在每個函式中用extern宣告需要使用哪些外部變數,就一定要記住在宣告處寫上extern
否則就會出現以下情況:
int max; /* 定義一個外部變數 */
int main(void)
{
int max; /* 沒有extern作外部變數宣告,這是在定義一個自動變數max,在程式碼塊內將覆蓋掉外部max */
}
也許“每個函式中宣告一遍該函式需要使用的外部變數”這一做法看上去很多餘,
但extern在引用其他檔案中定義的變數時,可以起到一種藉口的作用,
在大型軟體開發中更規範的編寫習慣可能會帶來更好更安全的效果
然而在大量引用其他檔案的情況下,外部變數本身在維護上也要多費點心思
如果現在有一個檔案中有一個外部變數,其在其他好幾個檔案中都需要使用,
但我們知道,無論它被哪個函式引用和賦值,它的每次修改後的值在所有引用的地方都是同步變化的
這其中就存在一些風險
3、初始化
和靜態變數類似,如果不對外部變數進行顯示初始化(如以上demo),那麼這個外部變數將被自動賦值0
如果是陣列變數則會生成全0陣列
與自動變數不同的是,外部變數的初始化只能用常量表達式:
int max = 1; /* 常量賦值 */
double min = 3.0 * 2.1; /* 常量表達式賦值 */
size_t L = sizeof(int); /* 型別不能是變長陣列,反之sizeof表示式是常量表達式 */
int min = max - 1; /* 不合法的變量表達式賦值 */
——參考《C Primer Plus第五版》
相關文章:
C語言關鍵字淺析-static
C語言關鍵字淺析-register
C語言關鍵字淺析-typedef