当前位置: 首页 > web >正文

【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.xdnf.cn/news/14727.html

相关文章:

  • 对象的实例化内存布局与访问定位
  • 从虚拟机角度解释python3相对导入问题(下)
  • 【Pandas】pandas DataFrame update
  • Kafka的消费消息是如何传递的?
  • langchain从入门到精通(十六)——Embedding文本嵌入模型介绍与使用
  • git学习资源
  • 模块化桌面机器人概念设计​​ - ModBot
  • 竹云受邀出席华为开发者大会,与华为联合发布海外政务数字化解决方案
  • AutoGPT,自主完成复杂任务
  • 有哪些词编码模型
  • Auto-GPT vs ReAct:两种智能体思路对决
  • 【Leetcode】有效的括号、用栈实现队列、用队列实现栈
  • 【25】木材表面缺陷数据集(有v5/v8模型)/YOLO木材表面缺陷检测
  • Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南
  • 如何制定团队制度?
  • 非对称加密实战:Python实现数字签名
  • 2025年CSS最新高频面试题及核心解析
  • 【C++】哈希表的实现(链地址法)
  • 并行计算与共识机制的创新融合,微美全息探索分片区块链机制
  • 计算机网络:(六)超详细讲解数据链路层 (附带图谱表格更好对比理解)
  • MATLAB GUI界面设计 第三章——仪器组件
  • Spring Boot + Logback MDC 深度解析:实现全链路日志追踪
  • 深入浅出Node.js中间件机制
  • R语言入门课| 05 一文掌握R语言常见数据类型
  • docker启动的rabbitmq搭建并集群和高可用
  • 算法与数据结构:动态规划DP
  • 【时时三省】(C语言基础)指针变量例子
  • Kafka 源码剖析:消息存储与协议实现(二)
  • Perplexity AI:对话式搜索引擎的革新者与未来认知操作系统
  • C++ - 标准库之 <string> npos(npos 概述、npos 的作用)