文件 1 (main.c):
extern int i, j;
int main() { i=1; j=2; return 0; }
文件 2 (other.c):
int i, j; // 定義
int main1() { printf("%d\n", i+j); return 0; }
現象:運行文件 2 時無輸出。
C 程序入口唯一且固定為 main() 函數。
main() 作為入口main1() 永遠不會被自動調用main() (文件 1),main1() 代碼雖在可執行文件中但從未執行// file1.c
#include <stdio.h>
extern int g_val; // 聲明:告訴編譯器 g_val 在別處定義
int main() {
g_val = 100;
print_val(); // 調用文件 2 的函數
return 0;
}
// file2.c
#include <stdio.h>
int g_val = 0; // 定義:分配內存,初始化
void print_val() {
printf("g_val = %d\n", g_val); // 輸出 100
}
編譯鏈接:gcc file1.c file2.c -o prog
extern 告訴編譯器:符號在別的編譯單元定義main() 修改共享變量,print_val() 讀取修改後的值| 錯誤 | 正確 | 說明 |
|---|---|---|
多文件各寫 main() | 僅一個 main(),其他寫功能函數 | 程序單入口 |
頭文件中 int g_val; | 頭文件 extern int g_val;,一個 .c 中定義 | 避免重複定義 |
extern int g_val = 10; 在頭文件 | 頭文件僅聲明,定義放 .c | 定義即分配存儲 |
以為 extern 會自動調用其他函數 | 需顯式調用 | 無魔法調用 |