xu-xiang/everything-claude-code-zh/cpp-coding-standards
Claude Code and agent skill by xu-xiang/everything-claude-code-zh
Trust tier 3
- community
Source check pending
Checking that the SKILL.md file is still in the repository.
基于 C++ 核心指南 (isocpp.github.io) 的 C++ 编码规范。在编写、评审或重构 C++ 代码时使用,以强制执行现代、安全且地道的实践。
Install
npx vskill@latest install xu-xiang/everything-claude-code-zh/cpp-coding-standardsSKILL.md
C++ 编码规范 (C++ Core Guidelines)
源自 C++ 核心指南 (C++ Core Guidelines) 的现代 C++ (C++17/20/23) 综合编码规范。强制执行类型安全 (Type safety)、资源安全 (Resource safety)、不变性 (Immutability) 和清晰度。
何时使用
- 编写新的 C++ 代码(类、函数、模板)
- 评审或重构现有的 C++ 代码
- 在 C++ 项目中做出架构决策
- 在 C++ 代码库中强制执行一致的风格
- 在语言特性之间进行选择(例如
enumvsenum class,原始指针 vs 智能指针)
何时不使用
- 非 C++ 项目
- 无法采用现代 C++ 特性的遗留 C 代码库
- 特定指南与硬件约束冲突的嵌入式/裸机上下文(需选择性调整)
核心原则 (Cross-Cutting Principles)
以下主题贯穿整个指南并构成基础:
- 处处 RAII (P.8, R.1, E.6, CP.20):将资源生命周期与对象生命周期绑定。资源获取即初始化 (RAII)
- 默认不变性 (P.10, Con.1-5, ES.25):优先使用
const/constexpr;可变性应当是例外。不变性 (Immutability) - 类型安全 (P.4, I.4, ES.46-49, Enum.3):利用类型系统在编译时防止错误。类型安全 (Type safety)
- 表达意图 (P.3, F.1, NL.1-2, T.10):名称、类型和概念应能传达目的。表达意图 (Express intent)
- 最小化复杂性 (F.2-3, ES.5, Per.4-5):简单的代码才是正确的代码
- 值语义优于指针语义 (C.10, R.3-5, F.20, CP.31):优先考虑按值返回和作用域对象。值语义 (Value semantics)
哲学与接口 (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 | 保持较少的函数参数数量 |
正确示例 (DO)
错误示例 (DON'T)
函数 (F.*)
核心规则
| 规则 | 摘要 | |
|---|---|---|
| F.1 | 将有意义的操作打包成命名谨慎的函数 | |
| F.2 | 函数应执行单一逻辑操作 | |
| F.3 | 保持函数简短且简单 | |
| F.4 | 如果函数可能在编译时求值,请将其声明为 constexpr | |
| F.6 | 如果函数绝不抛出异常,请将其声明为 noexcept | |
| F.8 | 优先选择纯函数 (Pure functions) | |
| F.16 | 对于“输入”参数,低开销拷贝类型按值传递,其他类型按 const& 传递 | |
| F.20 | 对于“输出”值,优先选择返回值而非输出参数 | |
| F.21 | 若要返回多个“输出”值,优先返回结构体 | |
| F.43 | 绝不返回指向局部对象的指针或引用 |
参数传递
纯函数与 constexpr
反模式 (Anti-Patterns)
- 从函数返回
T&&(F.45) - 使用
va_arg/ C 风格变长参数 (F.55) - 在传递给其他线程的 lambda 中按引用捕获 (F.53)
- 返回
const T,这会抑制移动语义 (F.49)
类与类层次结构 (C.*)
核心规则
| 规则 | 摘要 | |
|---|---|---|
| C.2 | 如果存在不变式 (Invariant),使用 class;如果成员数据独立变化,使用 struct | |
| C.9 | 最小化成员的公开暴露 | |
| C.20 | 如果可以避免定义默认操作,则不要定义(零法则 Rule of Zero) | |
| C.21 | 如果定义或 =delete 了任何拷贝/移动/析构函数,请处理所有五个(五法则 Rule of Five) | |
| C.35 | 基类析构函数:要么是 public virtual,要么是 protected non-virtual | |
| C.41 | 构造函数应创建一个完全初始化的对象 | |
| C.46 | 将单参数构造函数声明为 explicit | |
| C.67 | 多态类 (Polymorphic class) 应抑制公开的拷贝/移动 | |
| C.128 | 虚函数:必须精确指定 virtual、override 或 final 中的一个 |
零法则 (Rule of Zero)
五法则 (Rule of Five)
类层次结构
反模式 (Anti-Patterns)
- 在构造函数/析构函数中调用虚函数 (C.82)
- 对非平凡 (Non-trivial) 类型使用
memset/memcpy(C.90) - 为虚函数及其覆盖者提供不同的默认参数 (C.140)
- 使数据成员成为
const或引用,这会抑制移动/拷贝 (C.12)
资源管理 (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 而非 shared_ptr | |
| R.22 | 使用 make_shared() 创建 shared_ptr |
智能指针用法
RAII 模式
反模式 (Anti-Patterns)
- 裸
new/delete(R.11) - C++ 代码中使用
malloc()/free()(R.10) - 在单个表达式中进行多次资源分配 (R.13 —— 异常安全风险)
- 在
unique_ptr足以胜任的情况下使用shared_ptr(R.21)
表达式与语句 (ES.*)
核心规则
| 规则 | 摘要 | |
|---|---|---|
| ES.5 | 保持较小的作用域 | |
| ES.20 | 始终初始化对象 | |
| ES.23 | 优先选择 {} 初始化语法 | |
| ES.25 | 除非打算修改,否则将对象声明为 const 或 constexpr | |
| ES.28 | 对 const 变量的复杂初始化使用 lambda | |
| ES.45 | 避免幻数 (Magic constants);使用符号常量 | |
| ES.46 | 避免收窄/有损的算术转换 | |
| ES.47 | 使用 nullptr 而非 0 或 NULL | |
| ES.48 | 避免强制类型转换 (Casts) | |
| ES.50 | 不要转换掉 const 属性 |
初始化
反模式 (Anti-Patterns)
- 未初始化的变量 (ES.20)
- 使用
0或NULL作为指针 (ES.47 —— 应使用nullptr) - C 风格强制转换 (ES.48 —— 应使用
static_cast、const_cast等) - 转换掉
const属性 (ES.50) - 不带命名常量的幻数 (ES.45)
- 混合有符号和无符号算术运算 (ES.100)
- 在嵌套作用域中重复使用名称 (ES.12)
错误处理 (E.*)
核心规则
| 规则 | 摘要 | |
|---|---|---|
| E.1 | 在设计早期制定错误处理策略 | |
| E.2 | 当函数无法执行其分配的任务时抛出异常 | |
| E.6 | 使用 RAII 防止泄露 | |
| E.12 | 当不可能或不接受抛出异常时使用 noexcept | |
| E.14 | 使用专门设计的用户定义类型作为异常 | |
| E.15 | 按值抛出,按引用捕获 | |
| E.16 | 析构函数、释放操作和 swap 绝不能失败 | |
| E.17 | 不要试图在每个函数中捕获每个异常 |
异常层次结构
反模式 (Anti-Patterns)
- 抛出内置类型如
int或字符串字面量 (E.14) - 按值捕获(存在对象切割风险) (E.15)
- 静默吞掉错误的空 catch 块
- 使用异常进行流程控制 (E.3)
- 基于全局状态(如
errno)的错误处理 (E.28)
常量与不变性 (Con.*)
全部规则
| 规则 | 摘要 | |
|---|---|---|
| Con.1 | 默认情况下,使对象不可变 | |
| Con.2 | 默认情况下,使成员函数为 const | |
| Con.3 | 默认情况下,传递指向 const 的指针和引用 | |
| Con.4 | 对于构造后不改变的值使用 const | |
| Con.5 | 对于编译时可计算的值使用 constexpr |
并发与并行 (CP.*)
核心规则
| 规则 | 摘要 | |
|---|---|---|
| CP.2 | 避免数据竞态 (Data races) | |
| CP.3 | 最小化显式共享可写数据 | |
| CP.4 | 以任务 (Tasks) 而非线程 (Threads) 的方式思考 | |
| CP.8 | 不要使用 volatile 进行同步 | |
| CP.20 | 使用 RAII,绝不直接调用 lock()/unlock() | |
| CP.21 | 使用 std::scoped_lock 获取多个互斥锁 | |
| CP.22 | 持有锁时绝不调用未知代码 | |
| CP.42 | 不要无条件等待 | |
| CP.44 | 记得为你的 lock_guard 和 unique_lock 命名 | |
| CP.100 | 除非绝对必要,否则不要使用无锁编程 (Lock-free programming) |
安全加锁
多个互斥锁
反模式 (Anti-Patterns)
- 使用
volatile进行同步 (CP.8 —— 它仅用于硬件 I/O) - 分离线程 (Detaching threads) (CP.26 —— 生命周期管理将变得几乎不可能)
- 未命名的锁保护:
std::lock_guard<std::mutex>(m);会立即销毁 (CP.44) - 调用回调时持有锁 (CP.22 —— 死锁风险)
- 缺乏深厚专业知识却进行无锁编程 (CP.100)
模板与泛型编程 (T.*)
核心规则
| 规则 | 摘要 | |
|---|---|---|
| T.1 | 使用模板提升抽象层级 | |
| T.2 | 使用模板为多种参数类型表达算法 | |
| T.10 | 为所有模板参数指定概念 (Concepts) | |
| T.11 | 尽可能使用标准概念 | |
| T.13 | 简单概念优先使用简写表示法 | |
| T.43 | 优先选择 using 而非 typedef | |
| T.120 | 仅在确实需要时使用模板元编程 (Template metaprogramming) | |
| T.144 | 不要特化函数模板(应使用重载) |
概念 Concepts (C++20)
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/cpp-coding-standards/SKILL.md
Popularity
- Repository stars
- 229
- Repository forks
- 48
- 7-day trend score
- 27
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 21 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/xu-xiang/everything-claude-code-zh/cpp-coding-standards)