隨著專案規模增長,將所有代碼塞進單一 .c 文件會導致維護災難。C 語言通過頭文件聲明 + 源文件實現 + 主程序調用的模組化機制,支撐大型工程開發。
program.c#include <stdio.h>
int add(int n, int m) { return n + m; }
int sub(int n, int m) { return n - m; }
int main() {
int n = 10, m = 5;
printf("n+m=%d\n", add(n, m));
printf("n-m=%d\n", sub(n, m));
return 0;
}
1. 實現文件 cal.c
#include "cal.h"
int add(int n, int m) { return n + m; }
int sub(int n, int m) { return n - m; }
2. 頭文件 cal.h
#ifndef CAL_H
#define CAL_H
int add(int n, int m);
int sub(int n, int m);
#endif
3. 主程序 main.c
#include <stdio.h>
#include "cal.h"
int main() {
int n = 10, m = 5;
printf("n+m=%d\n", add(n, m));
printf("n-m=%d\n", sub(n, m));
return 0;
}
#include "cal.h" 表示當前目錄優先搜尋(相對路徑);#include <stdio.h> 尖括號表示系統標準路徑(絕對路徑)。#ifndef GUARD #define GUARD ... #endif。extern 變量聲明、型別定義、巨集。不可放定義(函數體、變量定義),否則多文件包含導致重複定義錯誤。GCC 直接列出所有 .c 文件:
gcc main.c cal.c -o program
等價於分步編譯鏈接:
gcc -c main.c -o main.o
gcc -c cal.c -o cal.o
gcc main.o cal.o -o program
-c 僅編譯不鏈接產生目標文件 .o,最後鏈接階段合併。這在 Makefile 中極其常見。
ar -rc libcal.a cal.o,使用 -lcal -L. 鏈接。gcc -shared -fPIC -o libcal.so cal.o,運行時需 LD_LIBRARY_PATH。