# Maguyva 對 C 的支援：系統與嵌入式程式碼的呼叫圖

Canonical source: https://maguyva.ai/zh-hant/languages/c

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 代理能在系統、韌體與函式庫程式碼中追蹤函式、結構、標頭引入與呼叫端。

## 支援概況

- 等級: AST 與符號支援
- 程式語言
- 副檔名: .c, .h
- 真正的 AST 剖析，支援語法感知搜尋與結構化情境。
- 具名符號支援語意查詢與交叉參照。啟用關係擷取後，即可使用圖譜導覽。
- 這個語言會為圖譜感知搜尋提供符號與關係；支援的邊類型會隨其原生構造而異。
- 同時支援 AST 剖析與符號擷取。

## 最適合的情境

- 韌體、嵌入式與作業系統團隊，對共用函式的一個小改動就可能波及硬體路徑。
- 長期維護的 C 函式庫，具有公開標頭檔、匯出巨集與大量內部翻譯單元。
- 由代理輔助的審查，核心問題是「誰在呼叫它，經由哪些標頭檔？」

## 代理工作流程

- 在變更函式簽章或錯誤處理之前，找出它的所有呼叫端。
- 梳理哪些檔案引入了某個標頭檔，以及它們使用了哪些結構。
- 從中斷處理常式或進入點出發，追蹤一個請求所到達的函式。

## 為什麼 C 需要呼叫圖，而不是 grep

C 沒有用來組織程式碼的類別或模組。結構存在於函式呼叫、標頭檔與結構之中，同一個名稱也可能出現在註解、巨集與字串常值裡。匯出巨集與註記巨集會包住宣告，讓只能剖析純 C 的工具出錯。對代理來說，安全的第一步就是呼叫圖。

Maguyva 會建立這張圖，讓代理在提出修改之前，就能看清一個函式會呼叫到什麼、又被什麼呼叫。

## Maguyva 在 C 中擷取了什麼

Maguyva 涵蓋 `.c` 與 `.h`。函式定義會被擷取為符號，結構與聯合可以在結構搜尋中作為型別定義選取。`#include` 指示詞會成為匯入關係。

匯出與可見性巨集（像 `FOO_API`、`DLLEXPORT` 或 `LIBEXPORT` 這類模式）以及執行緒安全註記巨集（例如 `GUARDED_BY` 與 `REQUIRES`）會在剖析前被遮蔽，因此被它們包住的宣告仍能剖析為宣告。類函式巨集的本體會被剖析；類物件巨集的本體則不會。

圖譜會記錄呼叫、標頭引入、複合常值實例化、型別參照、讀寫與控制流程。約 124 個標準 C 函式庫呼叫（`printf`、`malloc`、`free`、`memcpy`、`strlen` 等）會從關係中過濾掉，讓專案程式碼更加突出。

## 代理提示範例

- 「誰呼叫了 `uart_write`，無論是直接呼叫或經由其他函式？」（`dependency_search` 的 incoming 方向）
- 「哪些檔案引入了 `config.h`，它們使用了其中哪些結構？」（先用 `dependency_search`，再用 `find_symbol`）
- 「說明一個封包如何從接收中斷流向協定剖析器。」（`get_task_context`）

## 已知限制

- C 沒有類別，也沒有例外，因此繼承、介面實作、覆寫、拋出與捕捉關係被標記為不適用。
- `.h` 同時出現在 C、C++ 與 Objective-C 的副檔名清單中，因此混合語言的標頭檔會由這些設定檔共用。
- 對已過濾標準函式庫函式的呼叫不是圖譜的邊。需要找出每一個 `malloc` 或 `memcpy` 時，請使用 `text_pattern_search`。

## 下一步

透過[快速入門](/zh-hant/docs/quickstart)連接儲存庫，然後在[相容性頁面](/zh-hant/docs/compatibility)查看支援矩陣。如果同一棵程式碼樹中也有 C++ 程式碼，請閱讀 [C++ 指南](/zh-hant/languages/cpp)。

## 引擎細節

- C 支援涵蓋 `.c` 與 `.h`。函式定義是符號，結構與聯合是型別定義，`#include` 會成為匯入關係。
- 匯出、可見性與執行緒安全註記巨集會在剖析前被遮蔽，因此被包住的宣告仍能剖析。類函式巨集的本體會被剖析；類物件巨集的則不會。
- 約 124 個標準函式庫呼叫（如 `printf`、`malloc` 與 `memcpy`）會被過濾掉。繼承、覆寫與例外關係被標記為不適用。

## 實用的 MCP 進入點

- `find_symbol`: 需要定義與所有參照時，以函式或結構名稱查找。
- `dependency_search`: 在變更共用函式的簽章或錯誤處理之前，使用 incoming 走訪。
- `get_task_context`: 適合用於「說明一個封包如何從接收中斷流向協定剖析器」這類提示。
