跳至主要內容
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

    適合用於「說明一則行情訊息是如何抵達策略引擎的」這類提示。