在通訊、嵌入式系統等 C 語言應用領域,專案規模往往龐大且功能複雜,單靠一位工程師難以完成,團隊協作成為常態。專案中常混合 C、組合語言甚至 C++ 代碼,這無疑增加了管理難度。為了提升軟體品質,合理組織代碼與文件至關重要。
良好的代碼組織旨在實現:
採用層次化結構,典型嵌入式專案分為:驅動層、作業系統層、功能層、應用層。每層僅使用下層提供的介面,並為上層暴露介面。模組是層內完成特定功能的單元(如某設備驅動、某應用程式)。模組間透過介面溝通,實現高內聚、低耦合。
依據 C 語言特性:
.c 檔案實現模組內部邏輯。.h 檔案對外暴露介面:函式宣告、資料型別、全域變數、型別定義、巨集/常數定義。#include 對應 .h 即可使用功能。.h 不應導致使用者代碼需重寫(參考 COM 介面不變原則)。.c/.h)置於同一資料夾。.h 僅放宣告,.c 放定義;模組對外透明,使用者無需知曉實現細節。檔案/資料夾命名應反映功能。理想情況下,一個模組對應一個公開介面頭文件(module.h)。若模組需多個介面,則每個介面一個頭文件。所有頭文件應遵循:
允許:巨集、型別(typedef、struct、union、enum)、函式/資料宣告。
禁止:可執行代碼、資料定義(全域變數定義、函式定義)。
模組私有的函式、資料、巨集、常數、型別,嚴禁 在頭文件宣告(類比 OOP 的 private),應置於對應 .c 內部。
頭文件需包含外部使用所需的所有宣告,使用者 #include 該頭文件即可,無需額外包含其他前置頭文件(頭文件內部已 #include 依賴項)。
#ifndef MODULE_H
#define MODULE_H
/* 頭文件內容 */
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* 函式宣告 */
#ifdef __cplusplus
}
#endif
extern "C" 強制 C++ 連結器採用 C 風格符號(如 _foo),避免 C++ Name Mangling(如 _foo_int_int)導致連結失敗。
.c 對應(abc.c → abc.h)。extern 暴露共享資料,改提供存取函式(封裝性、安全性)。.c 內)。.c 組成一模組時,僅提供一個介面頭文件,內部 #include 各子模組介面。<系統名><模組名>。.c 共享全域變數(一處定義、多處使用),應建立專用頭文件,與介面頭文件區分。無對應 .c,多為大量巨集定義。建議:命名 功能.h、不包含其他頭文件、不定義型別、無資料/函式宣告。
模組名.c。static 修飾,限制作用域。extern(僅用於頭文件宣告)。上述建議旨在提升 C 專案品質。實踐中應靈活套用,並可引入面向物件與 COM 思想(介面隔離、封裝、多態模擬)寫出更高質量代碼。附錄提供 .h/.c 模板供參考。專案中常見的組合語言檔案,同樣需以 .h 暴露介面供 C 代碼調用。