本文彙整《高品質 C++/C 程式設計指南》完整章節結構,提煉各章核心原則,供開發者建立團隊編碼規範、程式碼審查清單之參考。
完整章節目錄
前言
確立指南目的:提升程式碼可讀性、可維護性、可靠性與效能,降低缺陷率。
第 1 章:檔案結構
- 標頭檔 (.h/.hpp) 與實作檔 (.cpp/.cc) 分離原則
- 檔案標頭區塊:模組名、專案、作者、日期、版本、說明
- 防重複包含:
#pragma once 或護衛宏
- 包含順序:系統標頭 → 第三方 → 專案內部
第 2 章:程式版面與排版
- 縮排:4 空格 (不含 Tab),一致性優先
- 大括號風格:K&R (左大括號行尾) 或 Allman (左大括號獨行),專案統一
- 行寬限制:80-120 字元
- 空行分隔邏輯區塊,單行單一陳述
第 3 章:命名規範 (上/下)
- 識別字:
PascalCase (類別/函數/型別)、camelCase (變數/參數)、UPPER_SNAKE_CASE (常數/巨集)
- 避免縮寫,語意完整:
GetUserCount 而非 GetUsrCnt
- 布林變數加前綴:
isValid, hasError, canExecute
- 介面類別加
I 前綴,抽象基類加 Abstract 或 Base
第 4 章:運算式與基本陳述
- 括號明確優先序,避免依賴運算子優先序記憶
switch 必含 default,case 以 break 結束 (註解落穿)
- 迴圈條件簡單化,複雜邏輯提煉為函數
- 避免巢狀超過 3 層,提早返回/繼續降低縮排
第 5 章:常數定義
- 優先
const/constexpr/enum class 替代 #define
- 魔術數字 (Magic Number) 禁用,提煉為具名常數
- 相關常數群組為
enum class 或 namespace
第 6 章:函數設計 (1-3)
- 單一職責:函數只做一件事,< 50 行
- 參數 ≤ 4 個,超過考慮結構體/類別封裝
- 優先傳值/const 參考,避免裸指標參數
- 錯誤處理:回傳碼 vs 例外 統一策略
- 內聯函數僅用於極小熱點路徑
第 7 章:記憶體管理 (1-7)
- RAII 原則:資源獲取即初始化,智慧指標 (
unique_ptr, shared_ptr) 取代裸 new/delete
- 嚴禁記憶體洩漏、重複釋放、使用後釋放
- 自訂配置器需符合標準配置器需求
- 循環參考用
weak_ptr 打破
- 陣列優先
std::vector/std::array
第 8 章:C++ 進階函數特性 (1-4)
- 重載決議、預設參數、預設引數陷阱
- Lambda 表達式捕獲模式、泛型 Lambda (C++14)
- 函數物件、
std::function、std::bind 使用場景
- 可變參數模板、折疊運算式 (C++17)
第 9 章:建構/解構/賦值函數 (1-4)
- 三/五/零法則:定義其一通常需定義所有
- 移動語義 (C++11):
std::move、右值參考、移動建構/賦值
- 複製-交換慣例實作強異常安全賦值
- 委派建構函數 (C++11)、繼承建構函數 (C++11)
第 10 章:繼承與組合 (1-2)
- 優先組合 (has-a) 而非繼承 (is-a),除非滿足 Liskov 替換原則
- 虛擬繼承解決菱形繼承,謹慎使用
- 介面隔離:純虛類別定義契約
- final/override (C++11) 明確語意
第 11 章:其他程式設計經驗 (1-2)
- 斷言 (
assert) 用於前置/後置條件檢查
- 日誌分級:Trace/Debug/Info/Warn/Error/Fatal
- 單元測試覆蓋率目標 ≥ 80%
- 程式碼審查清單化、自動化靜態分析整合 CI
核心原則速查表
| 原則 | 關鍵字 | 現代 C++ 實踐 |
| 資源管理 | RAII | 智慧指標、容器、鎖守衛 |
| 型別安全 | 強型別 | enum class、不隱性轉換、模板 |
| 介面設計 | 最小驚訝 | const 正確性、值語意、移動語意 |
| 錯誤處理 | 契約式 | 例外用於錯誤、Expected/Result 用於預期失敗 |
| 效能優化 | 量測優先 | 避免過早優化、分析器導向、資料導向設計 |
落地建議
- 團隊共同制定《編碼規範文件》,納入版控
- IDE 設定統一格式化規則 (
.clang-format, .editorconfig)
- CI 整合
clang-tidy, cppcheck, sonarqube 靜態分析
- 新人入職必讀、定期程式碼審查分享會
- 指南隨語言標準演進 (C++17/20/23) 定期更新
指南非教條,乃團隊共識基石。內化原則、靈活應用,始能寫出經得起時間考驗的高品質程式碼。