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;充分展现了…