SuperAPI AI 工具集

cpp-coding-standards

编程与开发

查看项目

更新于 10-15 10:24

技能介绍

C++ Coding Standards 是一套面向现代 C++(C++17/20/23)的综合编码规范,源自 C++ Core Guidelines(isocpp.github.io),其目标是强制类型安全、资源安全、不可变性与清晰性。

用途与适用时机 资料指出,该规范适用于:编写新的 C++ 代码(类、函数、模板);审查或重构既有 C++ 代码;在 C++ 项目中做架构决策;在 C++ 代码库中统一风格;以及在语言特性之间做选择(例如 enum 与 enum class、裸指针与智能指针)。 资料同时明确不适用:非 C++ 项目;无法采用现代 C++ 特性的遗留 C 代码库;嵌入式/裸机环境中特定规范与硬件约束冲突时(需选择性调整)。

贯穿性原则 规范列出贯穿全局的基础主题:处处使用 RAII(P.8、R.1、E.6、CP.20),将资源生命周期绑定到对象生命周期;默认不可变(P.10、Con.1-5、ES.25),从 const/constexpr 开始,可变是例外;类型安全(P.4、I.4、ES.46-49、Enum.3),用类型系统在编译期阻止错误;表达意图(P.3、F.1、NL.1-2、T.10),名称、类型和概念应传达目的;最小化复杂度(F.2-3、ES.5、Per.4-5);值语义优先于指针语义(C.10、R.3-5、F.20、CP.31)。

主要内容主题 规范按规则编号组织,覆盖多个方面: 哲学与接口(P.、I.):如 P.1 直接在代码中表达想法、P.3 表达意图、P.4 程序应静态类型安全、P.5 优先编译期检查、P.8 不泄漏资源、P.10 优先不可变数据;I.1 接口显式、I.2 避免非 const 全局变量、I.4 接口精确且强类型、I.11 绝不用裸指针或引用转移所有权、I.23 保持函数参数少。 函数(F.):F.1 把有意义操作封装为命名函数、F.2 单一逻辑操作、F.3 短小简单、F.4 可能编译期求值则 constexpr、F.6 不抛异常则 noexcept、F.8 优先纯函数、F.16 按类型选择传值或 const&、F.20 优先返回值而非输出参数、F.21 多返回值优先返回结构体、F.43 绝不返回局部对象指针或引用;并给出参数传递、纯函数与 constexpr 示例及反模式(如返回 T&&、C 风格可变参数、线程 lambda 按引用捕获、返回 const T 阻碍移动)。 类与类层次(C.):C.2 有不变量用 class,否则 struct;C.9 最小暴露成员;C.20 Rule of Zero;C.21 Rule of Five;C.35 基类析构 public virtual 或 protected 非 virtual;C.41 构造函数应创建完全初始化对象;C.46 单参构造函数声明 explicit;C.67 多态类抑制 public 拷贝/移动;C.128 虚函数只写 virtual、override、final 之一;并给出 Rule of Zero、Rule of Five、类层次示例与反模式。 资源管理(R.):R.1 用 RAII 自动管理资源;R.3 裸指针 T* 为非拥有;R.5 优先作用域对象;R.10 避免 malloc/free;R.11 避免显式 new/delete;R.20 用 unique_ptr 或 shared_ptr 表示所有权;R.21 非共享优先 unique_ptr;R.22 用 make_shared;给出智能指针、RAII 与反模式。 表达式与语句(ES.):ES.5 作用域小、ES.20 始终初始化、ES.23 优先 {} 初始化、ES.25 默认 const/constexpr、ES.28 复杂 const 初始化用 lambda、ES.45 避免魔法常量、ES.46 避免窄化转换、ES.47 用 nullptr、ES.48 避免强制转换、ES.50 不转换掉 const;并列出反模式。 错误处理(E.):E.1 设计早期制定策略、E.2 抛异常表示无法完成任务、E.6 RAII 防泄漏、E.12 不可能抛出用 noexcept、E.14 用专门用户定义类型作异常、E.15 按值抛按引用捕获、E.16 析构/释放/swap 绝不失败、E.17 不在每个函数捕获所有异常;给出异常层次示例与反模式。 常量与不可变性(Con.):Con.1 默认不可变、Con.2 成员函数默认 const、Con.3 指针和引用默认指向 const、Con.4 构造后不变用 const、Con.5 编译期可算用 constexpr;给出 Sensor 示例。 并发与并行(CP.):CP.2 避免数据竞争、CP.3 最小化显式共享可写数据、CP.4 以任务而非线程思考、CP.8 不用 volatile 做同步、CP.20 用 RAII 而非裸 lock/unlock、CP.21 用 scoped_lock 获取多个互斥量、CP.22 持锁不调用未知代码、CP.42 无条件不等待、CP.44 命名 lock_guard 和 unique_lock、CP.100 非必要不用无锁编程;给出安全加锁、多互斥量示例与反模式。 模板与泛型编程(T.):T.1 用模板提升抽象、T.2 用模板表达多类型算法、T.10 为所有模板参数指定概念、T.11 尽量用标准概念、T.13 简单概念用简写、T.43 用 using 而非 typedef、T.120 确需才用模板元编程、T.144 不特化函数模板(改用重载);给出 Concepts(C++20)示例与反模式。 标准库(SL.):SL.1 尽可能用库、SL.2 优先标准库、SL.con.1 优先 array/vector 而非 C 数组、SL.con.2 默认优先 vector、SL.str.1 用 string 拥有字符序列、SL.str.2 用 string_view 引用字符序列、SL.io.50 避免 endl(用 '\n');并给出示例。 枚举(Enum.):Enum.1 优先枚举而非宏、Enum.3 优先 enum class 而非普通 enum、Enum.5 不使用全大写(资料在此处内容中断)。

使用方式 资料未提供具体的安装命令、仓库克隆方式或命令行工具用法,暂未提供。该规范以规则条文、正反示例和反模式列表形式呈现,可直接作为编码与审查时的参照标准。