首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

程式設計風格規範系列(四):程式健壯性與可移植性鐵律

     編輯:關於C++

前言

本系列第四部分鎖定 **程式健壯性** (單一出口、資源管理、條件清晰) 與 **可移植性** (跨平台、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;
}
  • 單一返回點:便於在 `END:` 統一釋放資源、記錄日誌、斷言檢查。
  • 編碼錯誤碼:所有函數回傳 `long` (或 `HRESULT`),統一語義,呼叫端統一 `IF_ERROR_GOTO_END` 處理。

二、goto 應用鐵律:僅向後、僅用於錯誤清理

  • 嚴禁向前跳轉 (形成迴圈/意大利麵條代碼)。
  • 標籤統一命名 `END:`,置於函數尾部資源釋出區。
  • 現代 C++ 建議改用 RAII/智慧指標/範圍守衛 (`SCOPE_EXIT`),在編譯器支援下完全替代 `goto` 清理模式。

三、資源變量管理:取得即初始化、用畢即釋放、指標歸零

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) 將這些紀律內化為語言機制,讓編譯器替你守護鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved