本系列第四部分鎖定 **程式健壯性** (單一出口、資源管理、條件清晰) 與 **可移植性** (跨平台、C 介面、硬體抽象) 兩大工程品質支柱。
long FuncName(Params...)
{
long lResult = CM_OK; // 預設成功
// 參數驗證
if (param == NULL) {
lResult = CM_POINT_IS_NULL;
goto END; // 統一跳轉清理區
}
// 資源配置
Resource* pRes = Acquire();
if (!pRes) {
lResult = CM_MEM_ALLOC_FAIL;
goto END;
}
// 核心邏輯
lResult = DoWork(pRes);
// 統一清理
END:
if (pRes) Release(pRes);
return lResult;
}
long* pData = (long*)calloc(40, sizeof(long));
if (!pData) { lResult = CM_MEM_ALLOC_FAIL; goto END; }
// ... 使用 pData ...
if (pData) { free(pData); pData = NULL; } // 釋放後歸零,防雙重釋放/野指標
鐵律:定義即初始化 (哪怕是 `NULL`)、配對釋放、釋放後歸零。C++ 直接用 `std::unique_ptr`/`std::vector` 由編譯器保證。
// 差:靠運算子優先序
if (szFileName != NULL && lCount >= 0 || bIsReaded == TRUE)
// 好:括號明確分組,閱讀零心智負擔
if ( ((szFileName != NULL) && (lCount >= 0)) || (bIsReaded == TRUE) )
| 規則 | 具體做法 | 理由 |
|---|---|---|
| 跨平台編譯 | 代碼同時支援 Windows 98/NT (歷史) → 現代對應 Windows/Linux/macOS、x86/ARM | 避免綁定單一平台 SDK/行為 |
| 演算法核心用 C | 核心邏輯 (壓縮、加密、數學、解析) 以純 C 實作,對外提供 C 介面 | C 編譯器最普及、ABI 最穩定、最易被其他語言呼叫 (FFI) |
| 平台差異隔離 | 檔案系統、執行緒、網路、GUI 等平台相關代碼封裝在專屬模組,提供統一抽象介面 | 核心邏輯零 `#ifdef`,移植只改適配層 |
健壯性源於 **紀律**:單一出口統一清理、資源生命週期零疏漏、條件判斷零歧義。可移植性源於 **架構**:C 核心 + 平台適配層。兩者共同構成「寫一次、到處編譯、長期穩定運行」的工程基因。現代 C++ 以 RAII、標準庫、概念 (Concepts) 將這些紀律內化為語言機制,讓編譯器替你守護鐵律。