# Maguyva 對 C++ 的支援：大型程式碼庫的類別與呼叫圖

Canonical source: https://maguyva.ai/zh-hant/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-hant/docs/quickstart)連接儲存庫，然後在[相容性頁面](/zh-hant/docs/compatibility)查看支援矩陣。如果程式碼樹中有一部分是純 C，也請閱讀 [C 指南](/zh-hant/languages/c)。

## 引擎細節

- 像 `void Socket::send()` 這樣的類別外定義，會歸屬到其擁有者類別與命名空間，虛擬成員也會被記錄。
- 接收者型別推斷會追蹤參數、區域變數、欄位、範圍式 `for` 與 `auto`，並能看穿 `unique_ptr`、`shared_ptr` 與 `optional`。
- 基底類別子句會轉為繼承關係，`new` 運算式視為實例化，約 273 個標準函式庫名稱會從關係中過濾掉。

## 實用的 MCP 進入點

- `find_symbol`: 需要定義與呼叫端時，以 `OrderBook::match` 這類限定名稱查找。
- `dependency_search`: 在變更簽章之前，對基底類別或虛擬方法使用它，找出覆寫與呼叫端。
- `get_task_context`: 適合用於「說明一則行情訊息是如何抵達策略引擎的」這類提示。
