全域變量(外部變量)在函數外部定義,具有程序級的生命週期與跨函數的可見性。正確理解其作用域規則、extern/static 語義及跨文件共享機制,是模組化編程的基石。
extern 前向聲明當全域變量定義在使用它的函數之後時,需在函數內用 extern 聲明,告知編譯器「此變量已在外部定義,已分配空間,勿重複分配」。聲明後作用域從聲明處延伸至函數末尾。
int max(int x, int y) { return x>y?x:y; }
int main() {
extern int A, B; // 前向聲明
printf("%d\n", max(A, B));
}
int A = 13, B = -8; // 定義在 main 之後
區別:定義(分配空間)只能出現一次,不可加 extern;聲明可多次,必須加 extern。
大型專案常將函數分散在多個 .c 文件,各自編譯成 .o 再鏈接。若每個文件都定義同名全域變量,鏈接時會報「重複定義」錯誤。
標準做法:
globals.c)中定義所有需共享的全域變量。extern 聲明,不再定義。extern 聲明放入頭文件(globals.h),各文件 #include 即可。static 修飾全域).c 文件)可見,其他文件不可用 extern 引用。// module_a.c
static int internal_counter = 0; // 僅本文件可見
void increment() { internal_counter++; }
// module_b.c
// extern int internal_counter; // 鏈接錯誤:未定義符號
// 可放心定義同名 static 變量,互不干擾