extern 儲存類別規範
宣告變數extern的儲存類別規範會定義在外部層級,在任何程式的原始程式檔中的同名變數的參考。 內部extern宣告用來讓外部層級變數定義的區塊中的 [看得見。 否則宣告在外部層級,除非變數宣告時包含extern關鍵字只會顯示在該區塊中宣告它。
範例
本範例說明了內部和外部層級宣告:
// extern_StorageClassSpecified.c
#include <stdio.h>
void other( void );
int main()
{
// Reference to i, defined below:
extern int i;
// Initial value is zero; a is visible only within main:
static int a;
// b is stored in a register, if possible:
register int b = 0;
// Default storage class is auto:
int c = 0;
// Values printed are 1, 0, 0, 0:
printf_s( "%d\n%d\n%d\n%d\n", i, a, b, c );
other();
return;
}
int i = 1;
void other( void )
{
// Address of global i assigned to pointer variable:
static int *external_i = &i;
// i is redefined; global i no longer visible:
int i = 16;
// This a is visible only within the other function:
static int a = 2;
a += 2;
// Values printed are 16, 4, and 1:
printf_s( "%d\n%d\n%d\n", i, a, *external_i );
}
在這個範例中,變數i定義在外部層級的起始值 1。 extern中的宣告main函式用來宣告外部層級的參考i。 靜態變數a會初始化為 0 預設的情況下,由於省略初始設定式。 若要呼叫printf列印 1、 0、 0 度和 0 的值。
在other函式、 全域變數的位址i用來初始化靜態指標變數external_i。 此方法可行,因為有全域變數靜態存留期,這表示它的位址並不會在程式執行期間變更。 下一步],將變數i已重新定義為 16 的初始值的區域變數。 這個重複定義並不會影響外部層級的值i,這隱藏的本機變數名稱的用法。 通用值i現在已經可以存取只有間接在這個區塊內,透過指標external_i。 嘗試指派的位址自動變數i指標無法運作,因為它可能是不同區塊的每一次。 將變數a宣告為靜態變數且已初始化為 2。 這a不與衝突a在main,因為靜態在內部的層級的變數是只能在區塊內的 [看得見中所宣告。
將變數a增加 2,結果讓 4。 如果other函式所呼叫一次在相同程式中,預設值的a將會是 4。 內部靜態變數保留其值,當程式結束,並再重新進入的區塊中所宣告。