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

【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每半年重审一次规范适应团队与项目演化

相关文章:

  • 外贸网站是怎么做的seo优化策略
  • 靠做网站可以赚钱么杭州网络推广公司
  • 招聘网站开发人员哪里有网页设计公司
  • 邹城建设银行网站2021年年度关键词排名
  • 做seo要明白网站内世界足球排名前十名
  • 网络营销的基本方式网站内部链接优化方法
  • [ruby on rails] ActiveJob中 discard_on,retry_on和 rescue_from的应用
  • Python Polars库详解:高性能数据处理的新标杆
  • 使用markRaw实例化echarts对象
  • Python中class对象/属性/方法/封装/继承/多态/魔法方法详解
  • Python案例练习:字典专题(分析文章的文字与次数、设计星座字典、凯撒密码、摩尔斯密码)
  • 利用folium实现全国高校分布地图显示
  • 验证 TCP 连接在异常情况下的断开机制之进程(客户端)被 kill 掉
  • 如何将适用于 Docker 的 ONLYOFFICE 文档更新到 v9.0
  • React性能优化精髓之一:频繁setState导致滚动卡顿的解决方案
  • Verilog基础:编译指令`default_nettype
  • 图像融合中损失函数【3】--梯度强度损失
  • 从零开始学习Spring Cloud Alibaba (一)
  • 市面上重要的AI开发工具和框架
  • 快速搭建系统原型,UI界面,有哪些高效的AI工具和方法
  • Mysql之索引
  • 10-Python模块详解
  • git变更记录
  • 主机复制文字和文件到 Ubuntu 虚拟机
  • 【DeepSeek实战】3、Ollama实战指南:LobeChat+多网关架构打造高可用大模型集群
  • 【apache-maven3.9安装与配置】