1. extern
是什麼?
在C語言中,extern
表示「借用其他檔案已經定義的變數或函式」。例如,當你想在另一個檔案使用已經定義好的全域變數時,就會用到extern
。當你的程式分成多個檔案時,extern
可以幫助你在檔案之間共用資料。
你可以想像,程式裡面有很多房間,extern
就像是「借東西的契約」,讓你可以從隔壁房間借工具。意思是「這裡沒有這個東西,但隔壁房間有」。
範例
// file1.c
int g_data = 100;
// file2.c
extern int g_data;
void printData() {
printf("%dn", g_data); // 存取 file1.c 的 g_data
}
在這個例子裡,g_data
在file1.c
定義,但透過extern
,你可以在file2.c
存取這個變數。

2. extern
與全域變數的關係
extern
和全域變數特別有關聯。全域變數只要在程式裡定義一次,其他檔案都可以存取。但如果直接使用,其他檔案不知道這個變數在哪,所以要用extern
告訴編譯器「這裡有這個變數喔!」
要注意的是,extern
只是宣告,不會配置記憶體。變數的記憶體分配是在原本定義的檔案中完成的。
全域變數的範例
// file1.c
int counter = 0;
// file2.c
extern int counter; // 使用其他檔案定義的 counter
void incrementCounter() {
counter++; // 更新 counter 的值
}
3. 在標頭檔(Header File)中使用extern
當專案變大時,一直重複宣告變數或函式會很麻煩。這時就需要「標頭檔(Header File)」。標頭檔是專門整理共用資訊的地方。把extern
宣告放在標頭檔,其他檔案只要引入標頭檔,就能使用相同的全域變數或函式。
標頭檔就像是整個專案的「工具箱」,把共用的工具集中在一起,需要時各檔案都可以拿來用。
標頭檔的範例
// globals.h
extern int global_variable;
void printGlobalVariable();
// file1.c
#include "globals.h"
int global_variable = 10;
// file2.c
#include "globals.h"
void printGlobalVariable() {
printf("%dn", global_variable);
}

4. extern
常見的錯誤
使用extern
時有幾個常見的注意事項。例如,extern
宣告時不能同時初始化變數,因為extern
只是「宣告」,不是「定義」。如果你在沒有變數定義的檔案裡用extern
宣告,也會造成連結錯誤。
常見錯誤
extern int data = 100; // 不可以初始化
像上面這樣,extern
和變數同時初始化會出錯。extern
只是用來參照其他檔案的變數,不是用來定義或初始化變數的。
5. extern
的實用範例
extern
在大型專案特別有用。比如說,程式橫跨多個模組時,透過extern
可以讓大家共用資料和函式。
這種做法能讓程式更模組化、易於維護和閱讀。各檔案可以各自獨立,但需要共用資料時只要用extern
就行。
實用範例
// main.c
#include "globals.h"
int main() {
printGlobalVariable(); // 呼叫其他檔案定義的函式
return 0;
}
// globals.c
#include "globals.h"
int global_variable = 100;
void printGlobalVariable() {
printf("%dn", global_variable); // 輸出全域變數
}
這篇文章從extern
的基本到實務應用都涵蓋了。在C語言中理解extern
,對於程式分割與重複利用非常重要。