C語言 extern 關鍵字全解:跨檔案變數與全域變數的正確用法

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_datafile1.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,對於程式分割與重複利用非常重要。