# Maguyva의 C++ 지원: 대규모 코드를 위한 클래스와 호출 그래프

Canonical source: https://maguyva.ai/ko/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는 `.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` 등)은 관계에서 걸러집니다. 그래프는 호출, include, 상속, 오버라이드, 인스턴스화, 타입 참조, 읽기와 쓰기, `throw` 엣지를 기록합니다.

## 에이전트 프롬프트 예시

- "`Renderer::draw`를 오버라이드하는 클래스는 무엇이고, 누가 그것을 호출하나요?" (`dependency_search`)
- "`OrderBook::match`와 그 모든 호출자를 보여 줘." (`find_symbol`)
- "시장 데이터 메시지가 전략 엔진에 어떻게 도달하는지 설명해 줘." (`get_task_context`)

## 알려진 한계

- `.h`는 C, C++, Objective-C의 확장자 목록에 모두 들어 있어서, C와 C++가 섞인 트리의 헤더는 이 프로필들이 공유합니다.
- 객체형 매크로의 본문은 파싱되지 않으며, 필터링된 표준 라이브러리 이름에 대한 호출은 그래프 엣지가 아닙니다. 매크로와 `std::` 사용처에는 `text_pattern_search`를 사용하세요.

## 다음 단계

[빠른 시작](/ko/docs/quickstart)으로 저장소를 연결한 다음, [호환성 페이지](/ko/docs/compatibility)에서 지원 매트릭스를 확인하세요. 트리의 일부가 순수 C라면 [C 가이드](/ko/languages/c)도 읽어 보세요.

## 엔진 세부 정보

- `void Socket::send()` 같은 클래스 외부 정의는 소유 클래스와 네임스페이스에 귀속되며, 가상 멤버도 기록됩니다.
- 리시버 타입 추론은 매개변수, 지역 변수, 필드, 범위 기반 `for`, `auto`를 따라가며 `unique_ptr`, `shared_ptr`, `optional` 안까지 들여다봅니다.
- 베이스 클래스 절은 상속으로 이어지고, `new` 표현식은 인스턴스화로 계산되며, 약 273개의 표준 라이브러리 이름은 관계에서 걸러집니다.

## 유용한 MCP 진입점

- `find_symbol`: 정의와 호출자가 필요할 때 `OrderBook::match` 같은 한정 이름으로 쓰세요.
- `dependency_search`: 시그니처를 바꾸기 전에 베이스 클래스나 가상 메서드에 써서 오버라이드와 호출자를 찾으세요.
- `get_task_context`: “시장 데이터 메시지가 전략 엔진에 어떻게 도달하는지 설명해 줘” 같은 프롬프트에 쓰세요.
