以 extern
記憶體類別規範宣告的變數,是另一個原始程式檔中定義相同名稱的變數參考。 它可用來公開外部層級的變數定義。 宣告為 extern
的變數本身沒有配置記憶體;它只是名稱。
範例
下列範例說明內部和外部層級宣告:
// Source1.c
int i = 1;
// Source2.c
#include <stdio.h>
// Refers to the i that is defined in Source1.c:
extern int i;
void func(void);
int main()
{
// Prints 1:
printf_s("%d\n", i);
func();
return;
}
void func(void)
{
// Address of global i assigned to pointer variable:
static int *external_i = &i;
// This definition of i hides the global i in Source.c:
int i = 16;
// Prints 16, 1:
printf_s("%d\n%d\n", i, *external_i);
}
在此範例中,變數 i
定義在 Source1.c 中且初始值為 1。 extern
Source2.c 中的宣告會在該檔案中顯示 'i'。
在函式中 func
,全域變數 i
的位址是用來初始化 static
指標變數 external_i
。 這可運作,因為全域變數有 static
存留期,這表示其位址不會在程式執行期間變更。 接下來,變數 i
是定義在 func
範圍內的區域變數,且初始值為 16。 這個定義不會影響外部層級 i
的值,將其名稱用於區域變數會將之隱藏。 全域 i
的值現在只能透過指標 external_i
來存取。