分層、模組化、介面導向的專案結構設計指南
大型 C 專案通常包含驅動層、作業系統層、功能層、應用層等多層次結構,團隊協作需遵循嚴格的模組化原則。本文整理業界公認的檔案組織、標頭檔設計、原始檔規範與介面管理建議,目標在於達成高內聚、低耦合、可擴充、可維護、可移植、可測試的軟體品質屬性。
專案目錄結構建議
project/
├── config/ # 裁剪巨集 config.h
├── platform/ # 硬體/OS 相關程式碼 (隔離移植層)
├── driver/ # 驅動層模組 (每裝置一資料夾)
│ ├── uart/
│ │ ├── uart.c
│ │ └── uart.h
│ └── spi/
├── osal/ # 作業系統抽象層
├── service/ # 功能層模組 (業務邏輯)
│ ├── protocol/
│ └── storage/
├── app/ # 應用層主程式
│ └── main.c
└── build/ # 建置腳本、Makefile
標頭檔 (.h) 設計鐵律
| 規則 | 說明 |
| 僅含宣告 | 巨集、型別、函數原型、extern 變數;禁止可執行碼與定義 |
| 防重複引入 | #ifndef MOD_H #define MOD_H ... #endif |
| C++ 相容 | 以 extern "C" 包裹函數宣告 |
| 自給自足 | 內含所需 #include,使用者無需額外引入 |
| 最小公開 | 私有函數/資料勿暴露;共享資料提供 Get/Set 函數 |
| 版本穩定 | 介面發布後避免修改;必改時保持相容 |
標頭檔範本
#ifndef UART_H
#define UART_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h> // 自給自足
#include "common_types.h" // 依賴的公開型別
#define UART_BUF_SIZE 128
typedef enum { UART_OK, UART_ERR } uart_status_t;
uart_status_t uart_init(uint32_t baud);
uart_status_t uart_send(const uint8_t *buf, uint16_t len);
uint16_t uart_recv(uint8_t *buf, uint16_t maxlen);
#ifdef __cplusplus
}
#endif
#endif
原始檔 (.c) 規範
- 檔名與模組同名:
uart.c 對應 uart.h。
- 內部函數/資料加
static 限制作用域。
- 禁止
extern 宣告(應由 .h 提供)。
- 確保獨立編譯:不依賴特定建置環境的隱含巨集。
- 必要註解:模組用途、介面契約、已知限制。
進階主題
- 條件編譯裁剪:
config.h 集中管理 #define FEATURE_X,#ifdef FEATURE_X 控制編入。
- 測試/正式同碼基:以
DEBUG 巨集控制日誌輸出,避免維護雙版本。
- 多檔單模組:大型模組可拆
uart_tx.c、uart_rx.c,共用單一 uart.h。
- 子模組聚合:上層
driver.h 僅 #include "uart.h" #include "spi.h" 供應用層單一引入。
遵循上述規範,可將 C 專案的耦合度降至最低,支援百人團隊並行開發與長期演進。
- 上一篇文章: C 整數截斷行為與大小端模式判斷實作
- 下一篇文章: C 語言多維陣列動態實作與位址計算原理
Copyright ©
程式碼之家 All Rights Reserved