【C/C++】C++ 編程規范:101條規則準則與最佳實踐

C++ 編程規范:101條規則準則與最佳實踐

引言

C++ 是一門強大而復雜的語言,能高效控制硬件,也能寫出優雅抽象。然而,正因其復雜性,項目中若缺乏統一規范,極易陷入混亂、難維護、易出錯的泥潭。

本文總結了 101條 C++ 編程規范與最佳實踐,涵蓋 命名、結構、內存管理、多線程、異常、安全、性能等多個維度,旨在幫助開發者構建高質量、可維護、可擴展的 C++ 項目。


一、命名與風格(Rules 1–10)

#規則簡要建議
1類名使用大駝峰 PascalCaseThreadPool,提高可辨識性
2變量名使用小駝峰 camelCase例:logFilePath,區分于類名
3常量用 ALL_CAPS + _ 分隔強化不變含義,如 MAX_BUFFER_SIZE
4命名需語義明確避免 data, tmp,使用 configFilePath 更清晰
5縮寫僅限通用縮寫idx, buf,盡量使用全稱提升可讀性
6函數名用動詞 + 名詞例如 loadConfig() 表意清晰
7命名空間用小寫network::socket,避免歧義
8接口類加 I 前綴(可選)ILogger,強調為接口
9成員變量加前綴/后綴m__ 表示成員變量,增強可讀性
10enum class 替代裸 enum強類型更安全,防止命名沖突

二、代碼結構與風格(Rules 11–20)

#規則簡要建議
11每個頭文件只聲明一個模塊避免多義性,便于編譯與復用
12使用 #pragma once 或 include guard防止重復包含
13include 順序:本地 > 第三方 > STL增強可讀性與可維護性
14避免頭文件中包含過多實現使用前向聲明可減少依賴
15類/函數應單一職責有助于測試與擴展
16控制函數長度 < 60 行超過建議拆分子函數
17控制每個文件長度 < 2000 行模塊化設計更清晰
18每行不超過 120 字符保證閱讀體驗,特別在 review 時
19使用 4 空格縮進,禁止制表符統一格式,防止跨平臺混亂
20所有控制結構都用 {} 包圍防止隱式邏輯錯誤,如單行 if 陷阱

三、類設計與對象管理(Rules 21–30)

#規則建議
21所有成員變量應為私有使用 getter/setter 訪問
22提供合理構造/析構函數保證資源初始化與釋放對稱
23禁用復制/移動時應 = delete明確意圖,防止誤用
24explicit 阻止隱式轉換explicit Config(std::string path)
25避免裸指針作為成員使用 unique_ptr/shared_ptr 安全管理
26構造函數不做復雜邏輯僅初始化,不處理業務
27基類析構函數應為 virtual否則 delete 派生類有 UB
28優先使用組合而非繼承組合更靈活、低耦合
29不使用多重繼承(除非純接口)降低復雜度,避免菱形繼承問題
30避免深層繼承結構建議控制在 2 層以內

四、函數與模板(Rules 31–40)

#規則建議
31參數多于 3 個建議封裝結構體提高可讀性與擴展性
32參數傳遞規則明確小型值傳遞,大型對象引用
33函數返回值推薦智能指針或值傳遞避免裸指針和資源泄露
34函數要寫用途注釋特別是公共接口或庫函數
35模板邏輯應輕量,避免過多嵌套編譯時間壓力大時尤需注意
36合理使用 auto 簡化類型不影響語義的地方使用
37模板中加入 static_assert 限定增強類型安全性
38使用 constexpr 提升編譯期能力如常量計算函數
39控制模板遞歸深度編譯器對深層模板支持有限
40模板盡可能放 header 中定義避免鏈接錯誤(ODR 問題)

五、內存管理(Rules 41–50)

#規則建議
41禁止裸 new/deletemake_unique/make_shared 替代
42所有資源管理用 RAII讓析構自動釋放資源
43禁止手動 free/close封裝在類中自動釋放
44指針擁有權應清晰避免 ownership 混亂
45避免 shared_ptr 在多線程競爭使用 atomic_shared_ptr 或避免頻繁共享
46使用工具檢測泄漏如 Valgrind、ASan
47使用智能指針區分 shared/unique 語義更清晰,更安全
48不要傳值傳遞 shared_ptrconst& 降低引用計數開銷
49使用容器代替裸數組STL 容器更安全
50類封裝資源釋放邏輯遵守 RAII,職責清晰

六、異常處理與錯誤傳遞(Rules 51–60)

#規則建議
51盡量避免使用異常推薦 error code / Result<T> 結構
52異常必須 catch 并處理記錄日志,避免 silent fail
53不使用 catch (...)易隱藏邏輯錯誤
54構造函數中不拋異常否則無法確定對象是否成功創建
55明確錯誤處理模塊集中統一處理錯誤
56注釋中注明錯誤返回增強調用方對異常的理解
57編寫無副作用函數降低調試/測試成本
58日志輸出必須有上下文包括文件名/函數名/線程信息
59接口錯誤向上傳遞不要在底層吞掉問題
60異常路徑不得影響主邏輯性能異常處理應輕量快捷

七、多線程與并發(Rules 61–70)

#規則建議
61封裝線程操作避免裸用 std::thread
62原子操作使用 std::atomic避免競態條件
63使用細粒度鎖或無鎖結構提升性能,減少死鎖
64使用 lock_guard 管理鎖自動加鎖釋放
65不捕獲局部引用傳入線程否則線程中變量懸空
66避免死鎖控制鎖順序,使用 std::scoped_lock
67避免全局變量并發讀寫用線程局部存儲或加鎖保護
68構建線程池封裝并發任務避免線程爆炸與資源浪費
69不得在對象析構前 detach 線程否則存在野線程
70使用條件變量控制等待避免忙等浪費 CPU

八、性能優化(Rules 71–80)

#規則建議
71優化熱點路徑代碼中使用 likely / unlikely
72std::move 轉移資源防止不必要的拷貝
73使用 emplace_back避免對象額外構造拷貝
74使用 reserve 預分配空間降低 reallocation 成本
75避免頻繁申請釋放內存推薦對象池或內存復用
76避免虛函數熱路徑中使用可用策略模式等替代
77小函數可使用 inline減少函數調用開銷
78注意 ABI 兼容性跨平臺或多版本部署需考慮
79無序容器快于有序容器unordered_map 通常優于 map
80使用 string_view 避免拷貝尤其在字符串解析場景中

九、安全與健壯性(Rules 81–90)

#規則建議
81所有輸入必須校驗合法性防止越界、注入等問題
82檢查整數溢出風險使用安全加法函數
83禁止數組越界訪問at() 或容器封裝
84使用 RAII 管理資源防止內存泄漏或懸空指針
85IO 操作必須檢查返回值否則容易邏輯錯誤
86不在庫中使用 exit/abort破壞調用者行為
87庫中不處理 UI/日志由上層決定策略
88接口遵循最小權限原則降低攻擊面與耦合
89使用靜態分析工具輔助檢查如 clang-analyzer, cppcheck
90禁止未定義行為寫法避免 UB 問題,如越界指針、懸空引用等

十、工程實踐與工具鏈(Rules 91–101)

#規則建議
91接入持續集成(CI)自動編譯與檢查保障質量
92使用單元測試框架推薦 GTest/GMock
93使用代碼覆蓋率工具識別未測試路徑
94強制統一代碼格式化工具推薦 clang-format
95接入內存檢測工具如 AddressSanitizer
96使用 CMake 管理構建跨平臺統一構建系統
97單元測試覆蓋率 >= 80%提升可靠性
98所有代碼需 Code Review防止低級錯誤
99接入日志和監控模塊如 Prometheus、Grafana
100所有模塊應可獨立構建測試降低耦合度
101每半年重審一次規范適應團隊與項目演化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86499.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

柔性屏激光修屏禁區突破:新啟航如何實現曲面 OLED 面板的無損修復?

一、引言 柔性 OLED 面板憑借其輕薄、可彎曲等特性&#xff0c;在智能終端、可穿戴設備等領域廣泛應用。然而&#xff0c;生產過程中面板易出現缺陷&#xff0c;傳統修復方法難以滿足曲面 OLED 面板的無損修復需求。新啟航半導體有限公司在激光修屏技術上取得突破&#xff0c;…

UI前端與數字孿生結合案例分享:智慧零售的可視化解決方案

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;智慧零售的可視化變革 在數字化浪潮下&#xff0c;零售行業正從 “人貨場…

Docker 入門教程(四):容器命令

文章目錄 &#x1f433; Docker 入門教程&#xff08;四&#xff09;&#xff1a;容器命令創建并運行容器&#xff1a;docker run查看容器列表&#xff1a;docker ps停止、啟動、重啟容器刪除容器&#xff1a;docker rm進入容器&#xff1a;exec 和 attach查看容器日志&#xf…

2025.06.27【技術觀察L0】AlphaGenome:DeepMind推出的全新AI基因組解讀平臺

AlphaGenome&#xff1a;DeepMind推出的全新AI基因組解讀平臺詳解 2025年6月&#xff0c;Google DeepMind團隊正式發布了AlphaGenome——一款面向基因組功能解讀和變異效應預測的全新人工智能模型。AlphaGenome的出現&#xff0c;標志著AI在基因組學領域邁出了重要一步&#x…

[ARM-2D 專題]7. OOP實現之繼承,宏implement_ex的實現和解析

implement_ex宏是 Arm-2D 庫中用于面向對象編程&#xff08;OOP&#xff09;支持的核心宏定義。 implement_ex 宏的定義和作用 implement_ex 宏在 Library/Include/arm_2d_utils.h 中定義&#xff0c;用于在 C 語言中實現類似繼承的功能&#xff1a; /*!* \note do NOT use t…

默認構造函數

1、構造函數 一、什么是構造函數 c中有一種特殊的成員函數&#xff0c;他的名字和類名相同&#xff0c;沒有返回值&#xff0c;而在創建對象時會自動執行&#xff0c;類中的數據成員的初始化往往通過構造函數來實現。完成類中數據成員的初始化&#xff0c;同時也是類中的成員…

帶標簽的 Docker 鏡像打包為 tar 文件

現在還有人用docker嗎 要將帶標簽的 Docker 鏡像打包為 tar 文件&#xff0c;請使用 docker save 命令。以下是詳細操作指南&#xff1a; 一、單鏡像打包&#xff08;推薦方式&#xff09; # 基礎格式 docker save -o [輸出文件名].tar [鏡像名]:[標簽]# 示例&#xff1a;將…

基于GPS-RTK的履帶吊車跑偏檢測技術方案

基于GPS-RTK的履帶吊車跑偏檢測技術方案 1. 引言 1.1 項目背景 履帶吊車作為重型工程機械&#xff0c;其行駛穩定性直接關系到作業安全和設備壽命。跑偏現象會導致履帶異常磨損、轉向系統過載&#xff0c;嚴重時可能引發側翻事故。傳統檢測方法&#xff08;如激光測距或人工觀…

勾正數據大數據開發面試題整理-20250625

最近面了家公司&#xff0c;想看看自己多年不準備面試&#xff0c;靠著老本能面試成啥樣&#xff0c;算是試試水吧&#xff0c;一面過了&#xff0c;二面有個算法題沒答出來&#xff0c;整體答得狀態也不太好&#xff0c;應該是沒過。 一面 先來說說一面吧&#xff0c;一面是…

基于中國香港會計準則差異,中國企業在香港推廣ERP(SAP、Oracle)系統需要注意的細節

核心在于&#xff1a;ERP通常按單一會計準則設計主數據架構&#xff0c;但跨國企業需要同時滿足兩地報表要求。 用戶常見的場景包括&#xff1a; 1 科目體系能否同時承載CAS的專項儲備和HKFRS的禁止計提&#xff1f; 2 資產模塊如何兼容不同的減值轉回規則&#xff1f; 3 關聯…

【編譯原理】期末復習知識總結

目錄 題型 總結 編譯五大組成部分 編譯與解釋方式區別&#xff1f; 前端&#xff0c;后端&#xff0c;Why&#xff1f; 概念 推導、歸約 短語、簡單短語、句柄 文法 分類 正則文法&#xff08;3型&#xff09; NFA、DFA、最小化 自上而下語法分析&#xff08;推導…

【軟考高級系統架構論文】論微服務架構及其應用

論文真題 論微服務架構及其應用近年來,隨著互聯網行業的迅猛發展,公司或組織業務的不斷擴張,需求的快速變化以及用戶量的不斷增加,傳統的單塊(Monolithic) 軟件架構面臨著越來越多的挑戰,已逐漸無法適應互聯網時代對軟件的要求。在這一背景下,微服務架構模式(Microservi…

【人工智能】RAG分塊

在RAG&#xff08;檢索增強生成&#xff09;系統中&#xff0c;文檔分塊&#xff08;Chunking&#xff09;是決定系統性能的核心環節&#xff0c;直接影響檢索精度和生成質量。分塊需平衡語義完整性、檢索效率和上下文保留三大目標。 一、分塊的核心標準 1.1 分塊基礎知識? …

能耗管理新革命:物聯網實現能源高效利用

在全球能源危機與 “雙碳” 目標的雙重壓力下&#xff0c;企業與社會對能耗管理的重視程度達到前所未有的高度。然而&#xff0c;傳統能耗管理方式存在數據采集滯后、分析維度單一、節能措施粗放等問題&#xff0c;無法滿足精細化管理需求。物聯網技術憑借其強大的數據感知、傳…

基于CMS的黃道吉日萬年歷源碼(自適應)

本模板采用帝國cms7.5版UTF-8制作&#xff1b; 適用站點&#xff1a;時間查詢、時差計算、萬年歷、黃道吉日查詢、假期查詢、節氣表等&#xff1b; 源碼優勢&#xff1a;代碼精簡&#xff0c;利于SEO、UI大氣精簡&#xff0c;搜索引擎收錄高&#xff1b; 全站偽靜態無需刷新生成…

如何構建個人AIagent

構建個人AI Agent是一個結合技術實現和場景設計的系統工程&#xff0c;以下是分步驟的詳細指南&#xff0c;涵蓋從需求定義到部署落地的全流程&#xff1a; ?一、明確Agent定位&#xff08;關鍵第一步&#xff09;?? ?角色定義矩陣? 類型典型場景技術復雜度示例信息處理Ag…

lutris登錄不進去

日志 Cannot create Vulkan instance.This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU thatdoes not support Vulkan.ERROR at /home/abuild/rpmbuild/BUILD/vulkan-tools-1.4.313-build/Vulkan-Tools-vulkan-sdk-1.…

緩存與加速技術實踐-NoSQL之Redis配置與優化

目錄 #1.1關系數據庫與非關系型數據庫 1.1.1關心型數據庫 1.1.2非關系型數據庫 1.1.3非關系型數據庫產生背景 #2.1redis簡介 2.1.1redis安裝部署 2.1.2配置參數 #3.1redis命令工具 3.1.1redis-cli命令行工具 3.1.2redis-benchmark測試工具 #4.1redis數據庫常用命令 4.1.1ke…

走近科學IT版:FreeBSD系統下ThinkPad鍵盤突然按不出b、n、/和空格鍵了!

走近科學IT版&#xff1a;FreeBSD系統下ThinkPad鍵盤突然按不出b和n鍵了&#xff01; 很慌&#xff0c;以為鍵盤壞了&#xff0c;在控制臺無法按出b和n&#xff0c;但是在瀏覽器里&#xff0c;可以按出來。 重啟機器&#xff0c;結果在瀏覽器里也按不出來了.... 按Ctrl空格&a…

聚銘網絡入選嘶吼《中國網絡安全細分領域產品名錄》“云平臺安全管理”與“態勢感知”雙領域TOP10

近日&#xff0c;在嘶吼安全產業研究院發布的《中國網絡安全細分領域產品名錄》中&#xff0c;聚銘網絡憑借其核心產品——聚銘云端安全管家與聚銘安全態勢感知與管控系統&#xff0c;分別入選“云平臺安全管理”與“態勢感知”兩大關鍵細分領域TOP10榜單&#xff0c;充分展現了…