# MaguyvaのC++対応: 大規模コードのクラスとコールグラフ

Canonical source: https://maguyva.ai/ja/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解析とシンボル抽出の両方に対応しています。

## 最適な用途

- ゲームエンジン、トレーディングシステム、ブラウザなど、1つのヘッダー変更でツリーの半分が再ビルドされる大規模なC++コードベース。
- 実行されるメソッドが、呼び出し箇所とは別の場所で定義されている、仮想メソッドを持つクラス階層。
- シグネチャ変更の前に呼び出し元とオーバーライドを把握する必要がある、エージェント支援型のリファクタリング。

## エージェントワークフロー

- 基底クラスを変更する前に、仮想メソッドのオーバーライドをすべて見つける。
- `net::Socket::send` のような名前空間付きの関数やクラスメソッドの呼び出し元を、コードベース全体で一覧にする。
- クラスが `new` で生成される場所と、その次に触れるメンバーを追跡する。

## C++にテキスト検索ではなく構造が必要な理由

C++では、名前は一意ではありません。`send` は、フリー関数であり、3つのクラスのメンバーであり、4つ目のクラスではオーバーライドであるかもしれません。名前空間、テンプレート、そして `.cpp` ファイルにある `Socket::send` のような行外定義が、1つの型を多くのファイルに分割します。テキスト検索はすべての一致を返しますが、呼び出しがそのどれに届くのかはエージェントに教えてくれません。

Maguyvaはクラス、メンバー、呼び出しを所有者と結び付けてインデックスするため、エージェントは編集の前に本当の構造をたどれます。

## MaguyvaがC++で抽出するもの

Maguyvaは、`.cpp`、`.cc`、`.cxx`、`.hpp`、`.hh`、`.hxx` を含む、一般的なC++のソースとヘッダーの拡張子に対応しています。クラス、構造体、関数が抽出され、`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` を使ってください。

## 次のステップ

[クイックスタート](/ja/docs/quickstart)でリポジトリを接続し、[互換性ページ](/ja/docs/compatibility)で対応マトリクスを確認してください。ツリーの一部が素のCである場合は、[Cガイド](/ja/languages/c)もご覧ください。

## エンジンの詳細

- `void Socket::send()` のような行外定義は所有者であるクラスと名前空間に帰属し、仮想メンバーも記録されます。
- レシーバーの型付けは、パラメーター、ローカル変数、フィールド、範囲ベースの `for`、`auto` をたどり、`unique_ptr`、`shared_ptr`、`optional` の中まで見通します。
- 基底クラスの句は継承に反映され、`new` 式はインスタンス化として扱われ、約273個の標準ライブラリの名前は関係性から除外されます。

## 役立つMCPエントリーポイント

- `find_symbol`: 定義と呼び出し元が必要なときに、`OrderBook::match` のような修飾名で使ってください。
- `dependency_search`: シグネチャを変更する前に、基底クラスや仮想メソッドに対して使い、オーバーライドと呼び出し元を見つけてください。
- `get_task_context`: 「マーケットデータのメッセージがストラテジーエンジンに届くまでの流れを説明して」のようなプロンプトに使ってください。
