跳转到内容
cd /languages
  • 大规模原生代码
  • 编程语言
  • AST 和符号支持

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

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

为什么 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。

后续步骤

通过快速入门连接仓库,然后在兼容性页面查看支持矩阵。如果代码树中有一部分是纯 C,也请阅读 C 指南。

最适合场景

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

智能体工作流

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

引擎细节

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

常用 MCP 入口工具

  • find_symbol

    需要定义和调用方时,用 `OrderBook::match` 这样的限定名来查找。

  • dependency_search

    在修改签名之前,对基类或虚方法使用它,找出重写和调用方。

  • get_task_context

    适用于“解释一条行情消息是如何到达策略引擎的”这类提示词。