我們知道,程式的編譯單位是源程式檔案,一個原始檔可以包含一個或若干個函數。在函數內定義的變數是區域性變數,而在函數之外定義的變數則稱為外部變數,外部變數也就是我們所講的全域性變數。它的儲存方式為靜態儲存,其生存週期為整個程式的生存週期。全域性變數可以為本檔案中的其他函數所共用,它的有效範圍為從定義變數的位置開始到本原始檔結束。
然而,如果全域性變數不在檔案的開頭定義,有效的作用範圍將只限於其定義處到檔案結束。如果在定義點之前的函數想參照該全域性變數,則應該在參照之前用關鍵字 extern 對該變數作“外部變數宣告”,表示該變數是一個已經定義的外部變數。有了此宣告,就可以從“宣告”處起,合法地使用該外部變數。
來看一個簡單的例子:
#include <stdio.h>
int max(int x,int y);
int main(void)
{
int result;
/*外部變數宣告*/
extern int g_X;
extern int g_Y;
result = max(g_X,g_Y);
printf("the max value is %dn",result);
return 0;
}
/*定義兩個全域性變數*/
int g_X = 10;
int g_Y = 20;
int max(int x, int y)
{
return (x>y ? x : y);
}
程式碼中,全域性變數 g_X 與 g_Y 是在 main 函數之後宣告的,因此它的作用範圍不在 main 函數中。如果我們需要在 main 函數中呼叫它們,就必須使用 extern 來對變數 g_X 與 g_Y 作“外部變數宣告”,以擴充套件全域性變數的作用域。也就是說,如果在變數定義之前要使用該變數,則應在使用之前加 extern 宣告變數,使作用域擴充套件到從宣告開始到本檔案結束。
如果整個工程由多個原始檔組成,在一個原始檔中想參照另外一個原始檔中已經定義的外部變數,同樣只需在參照變數的檔案中用 extern 關鍵字加以宣告即可。下面就來看一個多檔案的範例:
/****max.c****/
#include <stdio.h>
/*外部變數宣告*/
extern int g_X ;
extern int g_Y ;
int max()
{
return (g_X > g_Y ? g_X : g_Y);
}
/***main.c****/
#include <stdio.h>
/*定義兩個全域性變數*/
int g_X=10;
int g_Y=20;
int max();
int main(void)
{
int result;
result = max();
printf("the max value is %dn",result);
return 0;
}
執行結果為:
the max value is 20
對於多個檔案的工程,都可以採用上面這種方法來操作。對於模組化的程式檔案,可在其檔案中預先留好外部變數的介面,也就是只採用 extern 宣告變數,而不定義變數,max.c 檔案中的 g_X 與 g_Y 就是如此操作的。
通常,這些外部變數的介面都是在模組程式的標頭檔案中宣告的,當需要使用該模組時,只需要在使用時具體定義一下這些外部變數即可。main.c 裡的 g_X 與 g_Y 則是相關範例。
不過,需要特別注意的是,由於用 extern 參照外部變數,可以在參照的模組內修改其變數的值,因此,如果有多個檔案同時要對應用的變數進行操作,而且可能會修改該變數,那就會影響其他模組的使用。因此,我們要慎重使用。