1. 程式人生 > >C語言關鍵字淺析-extern

C語言關鍵字淺析-extern

### 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語言關鍵字淺析-auto

C語言關鍵字淺析-static

C語言關鍵字淺析-register

C語言關鍵字淺析-typedef