# Maguyva 的 C++ 支持：面向大型代码库的类与调用图

Canonical source: https://maguyva.ai/zh-hans/languages/cpp

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva 以 AST、符号和图谱支持 C++，让 AI 智能体在大型 C++ 代码库中追踪类、命名空间、虚函数重写和调用方。

## 支持情况速览

- 支持等级: AST 和符号支持
- 编程语言
- 扩展名: .c, .c++, .cc, .cpp, .cxx, .h, 还有 4 个
- 真正的 AST 解析，支撑语法感知搜索和结构化上下文。
- 命名符号支撑语义查找和交叉引用。启用关系提取后，即可使用图谱导航。
- 该语言为图谱感知搜索提供符号和关系；支持的边类型随其原生构造而异。
- 同时支持 AST 解析和符号提取。

## 最适合场景

- 游戏引擎、交易系统、浏览器等大型 C++ 代码库，改一个头文件就要重新编译半棵代码树。
- 带有虚方法的类层次结构，实际运行的方法定义在与调用处不同的地方。
- 需要在修改签名之前掌握调用方和重写的智能体辅助重构。

## 智能体工作流

- 在修改基类之前，找出某个虚方法的所有重写。
- 在整个代码库中列出带命名空间的函数或类方法（例如 `net::Socket::send`）的调用方。
- 追踪某个类在哪里通过 `new` 构造，以及接下来触及了哪些成员。

## 为什么 C++ 需要结构，而不是文本搜索

在 C++ 中，名字并不唯一。`send` 可能是一个自由函数，又是三个类的成员，还是第四个类中的重写。命名空间、模板以及类外定义（例如 `.cpp` 文件中的 `Socket::send`）会把一个类型拆散到许多文件中。文本搜索会返回所有匹配，却不会告诉智能体一次调用究竟到达了哪一个。

Maguyva 在索引类、成员和调用时会附上它们的所属者，让智能体在修改之前就能沿着真实的结构前进。

## Maguyva 在 C++ 中提取什么

Maguyva 覆盖常见的 C++ 源文件和头文件扩展名，包括 `.cpp`、`.cc`、`.cxx`、`.hpp`、`.hh` 和 `.hxx`。类、结构体和函数都会被提取，像 `void Socket::send()` 这样的类外定义会归属到其所属的类和命名空间。虚成员会被记录，模板参数也是签名的一部分。

接收者类型推断会跟踪参数、局部声明、字段、基于范围的 `for` 循环和 `auto`，并能看穿 `unique_ptr`、`shared_ptr` 和 `optional`，因此像 `conn->send()` 这样的调用可以解析到正确的类。基类子句会转化为继承关系，`new` 表达式计为实例化。

与 C 相同的导出宏和注解宏屏蔽同样适用。约 273 个标准库名称（`std::cout`、`std::endl`、`printf` 等）会从关系中过滤掉。图谱记录调用、头文件包含、继承、重写、实例化、类型引用、读写以及 `throw` 边。

## 智能体提示词示例

- “哪些类重写了 `Renderer::draw`，谁在调用它？”（`dependency_search`）
- “显示 `OrderBook::match` 及其所有调用方。”（`find_symbol`）
- “解释一条行情消息是如何到达策略引擎的。”（`get_task_context`）

## 已知限制

- `.h` 同时出现在 C、C++ 和 Objective-C 的扩展名列表中，因此在 C 与 C++ 混合的代码树中，头文件由这些配置共享。
- 类对象宏的宏体不会被解析，对已过滤标准库名称的调用也不是图谱的边。查找宏和 `std::` 的用法请使用 `text_pattern_search`。

## 后续步骤

通过[快速入门](/zh-hans/docs/quickstart)连接仓库，然后在[兼容性页面](/zh-hans/docs/compatibility)查看支持矩阵。如果代码树中有一部分是纯 C，也请阅读 [C 指南](/zh-hans/languages/c)。

## 引擎细节

- 像 `void Socket::send()` 这样的类外定义会归属到其所属的类和命名空间，虚成员也会被记录。
- 接收者类型推断会跟踪参数、局部变量、字段、基于范围的 `for` 和 `auto`，并能看穿 `unique_ptr`、`shared_ptr` 和 `optional`。
- 基类子句会转化为继承关系，`new` 表达式计为实例化，约 273 个标准库名称会从关系中过滤掉。

## 常用 MCP 入口工具

- `find_symbol`: 需要定义和调用方时，用 `OrderBook::match` 这样的限定名来查找。
- `dependency_search`: 在修改签名之前，对基类或虚方法使用它，找出重写和调用方。
- `get_task_context`: 适用于“解释一条行情消息是如何到达策略引擎的”这类提示词。
