Claude Code 最近上线了一个让我眼前一亮的特性——Subagent(子代理)。它解决了主对话被无关细节塞满的痛点,让 Claude 真正像一支团队那样干活。这篇教程是我读完官方文档加上反复实测后的总结,覆盖原理、部署、用法、4 个开箱即用的 C++ 实战模板。

Subagent 是什么?
Subagent 就是 Claude 给你的"AI 副驾席位"。它是一个独立、有自己系统提示、自己工具白名单、自己上下文的 AI 助手,由主对话里的 Claude 在合适的时机自动调起,做完活只回一份精炼的摘要。
它的核心价值用一句话概括:让主对话的"脑子"不被无关细节塞满。
下面分四块讲清楚:价值、怎么部署、怎么用、最佳实践,以及 4 个完整的 C++ 实战案例。
一、Subagent 到底解决了什么问题?
先想象一个场景:你在 Claude Code 里写 C++ 代码,说"跑一下全套测试,把失败的列出来"。Claude 真的去跑了,结果返回 30 个测试文件、上万行日志——这些信息你大概率不会再看第二眼,但它们已经塞进了你的主对话上下文。
下一次对话,Claude 必须带着这些垃圾信息一起思考,响应变慢、要付的 token 也变多,甚至可能在某个时刻爆掉 context window。
Subagent 就是为了避免这种浪费。具体来说,它给你带来 5 个核心价值:
1. 保留主上下文(最常用)
跑测试、读日志、查文档、扫代码——这些"重操作"丢给 subagent,详细结果留在它的上下文里,只回一份摘要给你。主对话永远是干净的。
2. 强制安全约束
Subagent 可以被锁死只能用什么工具。比如你定义一个"只能读数据库、不能改"的 subagent,它就算被你引到错误的方向,也跑不动 UPDATE 语句。
3. 跨项目复用
一个写好的 code-reviewer subagent,放在 ~/.claude/agents/ 下,这台电脑上每个项目都能用。比每次手动塞提示词省事一万倍。
4. 行为专精化
普通 Claude 是"万能通才",subagent 可以是"专才"——你可以给它一套专门针对 C++ 性能优化的系统提示,让它的输出比通用模式靠谱得多。
5. 成本控制
给一个简单的"扫一遍代码找错别字"任务挂 model: haiku,给"重构整个模块"挂 model: opus——该省的省,该猛的猛。
二、如何在 Claude 桌面端部署 Subagent
桌面端(macOS / Windows 桌面应用)和终端的 Claude Code 共用同一套 subagent 配置——文件位置一模一样。
2.1 三种存放位置(作用域)
| 位置 | 作用域 | 优先级 |
|---|---|---|
~/.claude/agents/ | 用户级(本机所有项目) | 4 |
.claude/agents/ | 项目级(仅当前仓库,建议 git 共享) | 3 |
--agents CLI 参数 | 仅本次会话(临时测试用) | 2 |
建议:项目级 subagent 用 .claude/agents/ + 提交 git,团队共享;个人反复用的放 ~/.claude/agents/。
2.2 Subagent 文件长什么样?
一个 subagent 本质上就是一个 带 YAML frontmatter 的 Markdown 文件,文件名随便起(通常用 kebab-case),但 frontmatter 里的 name 字段才是真正标识它的东西。
---
name: cpp-code-reviewer
description: 审查 C++ 代码的安全性、性能和现代 C++ 习惯用法(modern C++ idioms)。在写完或改动 C++ 代码后主动使用。
tools: Read, Grep, Glob, Bash
model: sonnet
---
你是一名资深 C++ 代码审查员。请按以下步骤工作:
1. 用 git diff 查看最近改动
2. 聚焦被修改的文件
3. 按优先级给出反馈
审查清单:
- 是否有内存安全问题(裸指针、所有权不清晰)
- 是否使用了现代 C++(C++11/14/17/20)特性替代旧写法
- RAII 是否到位
- 异常安全性
- 性能热点(不必要的拷贝、虚函数滥用、锁粒度)
- 命名、注释、可读性
按严重程度分三档输出:Critical / Warning / Suggestion,每条都给出具体改进示例。
字段说明(只需要记几个常用的):
name(必填):小写+连字符,比如cpp-code-reviewerdescription(必填):决定 Claude 何时自动调它,写得越具体越好;想让它"主动触发"就加"Use proactively"tools:白名单,省略则继承主对话所有工具disallowedTools:黑名单,比如disallowedTools: Write, Edit让它只能看不能改model:可填sonnet/opus/haiku/inherit,默认inheritpermissionMode:可选plan/acceptEdits/bypassPermissions等isolation: worktree:让 subagent 在隔离的 git worktree 里干活,不会污染你当前工作区
2.3 三种创建方式
方式 A:让 Claude 帮你写(最简单)
直接在桌面端对话里说:
在 ~/.claude/agents/ 下给我建一个 cpp-performance-reviewer subagent,专门审查 C++ 代码的性能瓶颈,建议改进方案。只读,不要写文件。用 Sonnet。
Claude 会自己把文件写好,你确认一下内容即可。
方式 B:手动创建
桌面端文件管理器里建 ~/.claude/agents/cpp-reviewer.md,把上面的模板贴进去改改,保存。
方式 C:CLI 临时定义
终端启动时直接传:
claude --agents '{
"cpp-reviewer": {
"description": "C++ 代码审查专家",
"prompt": "你是一名资深 C++ 审查员...",
"tools": ["Read", "Grep", "Glob"],
"model": "sonnet"
}
}'
这种方式只在本次会话有效,适合临时测试或自动化脚本。
2.4 重要提示
桌面端启动后 subagent 文件是热加载的,改完几秒内生效,不用重启。但是有 2 个例外:
- 第一次创建某个 agents 目录时,需要重启一次让它发现
--disable-slash-commands启动的会话完全不监听
三、使用 Subagent 的三种姿势

3.1 自然语言(最常用,让 Claude 自己决定)
让 cpp-reviewer 帮我看看刚才那波改动的性能问题
Claude 根据 subagent description 里的描述判断要不要调它。
3.2 @-mention(强制指定,不想让 Claude 纠结)
输入 @ 会弹出选择器,选你的 subagent:
@cpp-reviewer 看一下这次重构有没有泄漏
适用场景:你想 100% 确定是某个 subagent 在干活,而不是被 Claude 临时换成 Explore 之类的通用代理。
3.3 全会话代理(–agent,最彻底)
启动时直接:
claude --agent cpp-reviewer
整场对话的主线程就变成了这个 subagent——用它的系统提示、它的工具集、它的模型。这种用法适合"我今天就要专心做 C++ 审查"这种场景。
四、Subagent 最佳实践(亲测有效的几条)
1. 写好 description 是关键
Claude 是根据 description 决定何时调你的 subagent 的。一个模糊的 description 会被无视:
# 差
description: Reviews code
# 好
description: Expert C++ code reviewer focused on memory safety, RAII, modern C++ idioms (C++17/20), and performance hot spots. Use proactively after modifying any C++ source file.
秘诀:说清楚做什么 + 触发时机("after modifying" / "when failing")+ 用 "Use proactively" 让 Claude 更愿意主动调。
2. 工具白名单越小越好
只读审查就别给 Write/Edit;调试就只给 Bash;SQL 查询只给 Bash + hook 校验。
# 只读 C++ 审查
tools: Read, Grep, Glob, Bash
# ❌ 没列 Write/Edit → 写不进去,安全
# C++ 性能调优(要改代码)
tools: Read, Grep, Glob, Edit, Write, Bash
3. 隔离大输出任务
明确告诉 Claude 把这些丢给 subagent:
用一个 subagent 跑全套测试,只把失败的 case 和错误信息报告给我。
用 subagent 去翻 vendor/ 下的所有 boost 头文件,看有没有用到的 deprecated API。
4. 并行研究,互不相关的任务同时开多个
同时用 subagent 研究 auth、database、API 三个模块,最后给我一份综合报告。
桌面端支持后台 subagent,任务并行跑,主对话还能继续编辑代码。
5. 链式 subagent
先用 cpp-reviewer 找性能问题,再用 cpp-optimizer 去修。
每个 subagent 只关心自己的事,最后主对话得到一条干净的处理链。
6. 用 isolation: worktree 避免污染主分支
跑大规模自动重构、加测试生成时,让 subagent 在独立 git worktree 里干活。
7. 用 memory 让 subagent 越用越聪明
---
name: cpp-reviewer
memory: project # 推荐:团队能共享
---
然后在系统提示里写:
完成审查后,把发现的模式和约定更新到你的 memory。
久而久之,这个 subagent 会"记住"你们项目的编码风格、反复出现的问题。
8. hooks 做精细控制
需要比白名单更细的规则时(比如"Bash 只允许 SELECT 不允许 DELETE"),写一个 PreToolUse hook:
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/check-cpp-build.sh"
9. 团队共享 subagent
项目级的 .claude/agents/*.md 建议提交 git,并在 PR 里 review 每个新加的 subagent,像 review 普通代码一样 review prompt——它们就是配置即代码(Configuration as Code)。
10. 调试时记住的小工具
/doctor会检查 subagent 文件的健康度(重复 name、缺失字段等)~/.claude/projects/{project}/{sessionId}/subagents/下有每次 subagent 调用的完整转录,出问题时翻这里
五、实战案例:4 个开箱即用的 C++ Subagent
下面给你四个开箱即用的 C++ 场景 subagent,可以直接复制到 ~/.claude/agents/ 下试。
案例 1:C++ 代码审查员(只读)
适用:PR 提交前 / 重大改动后的自动审查
---
name: cpp-reviewer
description: Expert C++ code reviewer. Use proactively after modifying any .cpp/.h/.hpp/.cc file. Focuses on memory safety, modern C++, performance, and exception safety.
tools: Read, Grep, Glob, Bash
model: sonnet
---
你是一名资深 C++ 代码审查员,熟悉 C++11/14/17/20/23。
## 启动时执行
1. `git diff` 查看最近改动
2. 用 Glob 找到所有改动的 .cpp/.h/.hpp 文件
3. 逐文件审查
## 审查维度(按优先级排序)
### Critical(必须修)
- 内存安全:use-after-free、double free、buffer overflow
- 悬垂引用 / iterator 失效
- 数据竞争(多线程场景)
- 未捕获异常逃出 main 或线程边界
### Warning(建议修)
- 应该用 `std::unique_ptr` / `std::shared_ptr` 的地方用了裸指针
- 应该用 `std::string_view` / `std::span` 的地方用了拷贝
- 虚函数能 `final` 没 `final`、能 `override` 没 `override`
- 拷贝构造和移动构造语义不对等
- 锁粒度过粗、持有锁期间调用外部代码
- C 风格数组、`malloc/free` 残留
### Suggestion(可选)
- 范围 for 替代下标循环
- `constexpr` / `consteval` 替代宏
- `std::format` 替代手写字符串拼接
- structured bindings、`std::optional`、`std::variant` 替代特殊值/union
- 命名空间污染、`using namespace std;`
## 输出格式
## Critical
- `src/foo.cpp:42` — 描述问题
当前:
```cpp
// ...
```
建议:
```cpp
// ...
```
理由:...
## Warning
...
## Suggestion
...
不要寒暄,直接给结论。
怎么用:
@cpp-reviewer 审查一下我刚改的 src/database/connection_pool.cpp
案例 2:C++ 性能优化专家(可改文件)
适用:发现性能瓶颈,让 subagent 提出 + 实施优化方案
---
name: cpp-perf-optimizer
description: C++ performance optimization specialist. Use when you have a profiled hot path, a slow function, or want to optimize memory allocations. Can edit files.
tools: Read, Grep, Glob, Edit, Write, Bash
model: sonnet
---
你是 C++ 性能优化专家。
## 工作流
1. 先读 profile 数据(perf / flamegraph / callgrind 输出的位置由用户告知,或者用 `Bash` 跑 `perf stat`)
2. 定位 hot path
3. 量化优化前后的改进(assignments, allocations, cache misses)
4. 一次性提出方案;用户确认后实施
## 优化清单
- **不必要的拷贝**:值传递 → const 引用 / 移动语义
- **动态分配**:能用 `std::vector::reserve` / `small_vector` / SSO string 就别裸 new
- **虚函数**:热路径上的 `virtual` → CRTP / `std::variant` / template
- **分支预测**:冷分支用 `[[unlikely]]`
- **缓存友好**:AoS → SoA,减少 false sharing(`alignas(64)`)
- **并发**:能用 `std::async` / 线程池就别自己起裸线程
- **编译期**:`constexpr` / template metaprogramming 替代运行期分支
## 输出要求
- 每个改动都标注:优化点 / 原理 / 预期收益
- 改动后给一段对比测试代码或 micro-benchmark 建议
- 不要破坏 ABI 接口(除非用户明确同意)
案例 3:C++ 构建/编译错误诊断器
适用:面对 g++/clang++ 几百行错误输出时
---
name: cpp-build-fixer
description: Diagnoses C++ build errors (g++, clang++, MSVC) and proposes minimal fixes. Use when compilation fails with cryptic template or linker errors.
tools: Read, Grep, Glob, Bash
model: sonnet
---
你是 C++ 构建错误诊断专家。
## 工作流
1. 读取用户给的编译命令和完整错误输出(常常非常长)
2. **只回主对话一句:诊断结论 + 最可能的根因 + 具体修复建议**
3. 详细分析留在你自己的上下文里,不要让主对话被刷屏
## 你需要掌握的常见错误模式
- **模板**:SFINAE 失败、enable_if 误用、ADL 行为、C++20 concepts 未满足
- **链接器**:未定义引用通常是因为 inline / extern "C" / 命名空间 / 库顺序
- **MSVC vs GCC/Clang**:warning-as-error 行为差异、`/permissive-` 影响
- **头文件**:循环依赖、ODR 违规、宏污染、inline 函数在 cpp 中定义
- **ABI**:跨编译器(libstdc++ vs libc++)混用的 mangling 问题
- **C++ 版本**:`-std=c++17` 下用 `std::filesystem` 忘链接 `-lstdc++fs`(GCC 8/9)
## 输出格式
**根因**:一句话
**位置**:file:line(如果能从错误信息中提取)
**修复**:
```cpp
// 修改前
...
// 修改后
...
```
**说明**:为什么这么改
最多 5 条根因,按可能性排序。
为什么这个 subagent 价值大:MSVC 一旦爆模板错误,几千行输出很正常,主对话会直接被塞满。这个 subagent 把"看错误"的工作吞下,回你 5 句话。
案例 4:C++ 单元测试生成器
适用:给已有模块补单元测试
---
name: cpp-test-generator
description: Generates GoogleTest / Catch2 / doctest unit tests for C++ classes and free functions. Use proactively after writing new C++ code or when test coverage is low.
tools: Read, Grep, Glob, Write, Bash
model: sonnet
---
你是 C++ 单元测试生成专家。
## 风格
- 框架根据项目已有依赖选(grep `find_package(gtest)` 或 `Catch2` 决定)
- 测试名遵循 `Given_When_Then` 或 `MethodName_Condition_ExpectedBehavior`
- 每个测试独立、可重复、无外部依赖(必要时用 interface + fake)
## 覆盖要求
1. 正常路径(happy path)
2. 边界值(空容器、零、最大、INT_MAX、size_t 上溢)
3. 异常路径(应抛异常的输入)
4. 资源路径(RAII、泄漏)
5. 并发场景(如果函数声称是 thread-safe)
## 输出
- 测试文件路径遵循项目惯例(`tests/`、`test/`、`*_test.cpp` 同目录)
- 包含构建说明:CMake `add_executable` + `gtest_discover_tests` 或类似
- 自动跑一遍编译并修掉你自己的语法错误
不要生成无意义的"确保不崩溃"测试。每个断言都要有针对性。
怎么把这四个用起来
把上面四个 .md 文件扔到 ~/.claude/agents/ 下,重启一次桌面端,然后:
@cpp-reviewer 帮我审一下 src/database/connection_pool.cpp
刚改完,先用 cpp-test-generator 给 connection_pool 补一组单元测试,再用 cpp-reviewer 过一遍,最后用 cpp-perf-optimizer 看下有什么优化空间。
桌面端会自动把这串 subagent 串起来,主对话保持干净,结果以摘要形式回来。
六、一张表速查:什么时候用 subagent vs 主对话
| 场景 | 推荐 |
|---|---|
| 跑测试、看日志、抓错误堆栈 | ✅ subagent |
| 大规模代码搜索 / 调研 | ✅ subagent |
| 多模块并行研究 | ✅ subagent |
| 需要严格工具约束 | ✅ subagent |
| 跨项目都要用 | ✅ subagent |
| 频繁迭代、需要 Claude 一直保持上下文 | ❌ 主对话 |
| 快速小改 | ❌ 主对话 |
| 延迟敏感的对话 | ❌ 主对话(subagent 启动开销) |
| 复用一段提示词做特定工作流 | 考虑 Skill(在主对话上下文里跑) |
| 简单"我没听懂刚才那句" | /btw(主对话侧问,不污染历史) |
七、一句话总结
Subagent = 隔离的上下文 + 专精的系统提示 + 受限的工具 = 一个不会弄脏你主对话的 AI 副驾。
下次再遇到"这段调试日志我以后不会再看但 Claude 必须先看完"的情况,就该考虑把它丢给 subagent 了。从一个简单的 cpp-reviewer 开始,慢慢养出一支专属于你工作流的 AI 团队。