隨著代碼增長,單文件編程會變得難以維護。C語言通過頭文件(.h)聲明 + 源文件(.c)實現 + 主程序調用實現模塊化。
#ifndef _MATH_H #define _MATH_H // 四則運算函數聲明 int Add(int a, int b); int Sub(int a, int b); int Mul(int a, int b); double Div(int a, int b); // 除法返回double #endif
關鍵點:
• #ifndef/_define/_endif防重複包含
• 不包含函數體,無static、無全局變量定義
• 僅含extern函數原型(extern可省略)
#include "Math.h" // 必須包含自己的頭文件,驗證聲明一致性
#include <stdio.h>
int Add(int a, int b) { return a + b; }
int Sub(int a, int b) { return a - b; }
int Mul(int a, int b) { return a * b; }
double Div(int a, int b) {
if (b == 0) {
printf("Error: Division by zero\n");
return 0.0;
}
return (double)a / b;
}
注意:實現文件必須#include "Math.h",確保聲明與定義一致,編譯器會檢查參數類型匹配。
#include <stdio.h>
#include "Math.h" // 包含模塊頭文件
int main(void) {
int a = 15, b = 10;
printf("a + b = %d\n", Add(a, b));
printf("a - b = %d\n", Sub(a, b));
printf("a * b = %d\n", Mul(a, b));
printf("a / b = %.2f\n", Div(a, b));
return 0;
}
# GCC gcc -c Math.c -o Math.o # 編譯為目標文件 gcc main.c Math.o -o main # 鏈接生成可執行文件 # 或一步到位 gcc main.c Math.c -o main # MSVC (cl.exe) cl /c Math.c cl main.c Math.obj
原文提到VC6.0中主程序必須用.c後綴,.cpp會報錯。原因可能是:
• .cpp默認啟用C++名稱修飾,導致鏈接時找不到C函數符號
• 解決:在頭文件用extern "C"包裹,或強制編譯為C(/TC)
include/放頭文件,src/放實現,test/放測試ar rcs libmath.a Math.o,鏈接時-lmath -L.gcc -shared -fPIC Math.c -o libmath.soMATH_VERSION,運行時檢查兼容性C語言模塊化核心是聲明與定義分離:
.h = 契約(接口),.c = 實現(細節),main.c = 使用者。
這不僅提高可維護性,更是團隊協作、代碼復用、庫開發的基礎。