# C บน Maguyva: กราฟการเรียกสำหรับโค้ดระบบและโค้ดฝังตัว

Canonical source: https://maguyva.ai/th/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 รองรับ C ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามฟังก์ชัน struct การ include และผู้เรียกในโค้ดระบบ เฟิร์มแวร์ และไลบรารี

## ภาพรวมการรองรับ

- ระดับ: รองรับ AST และสัญลักษณ์
- การเขียนโปรแกรม
- นามสกุลไฟล์: .c, .h
- การแยกวิเคราะห์ AST จริงสำหรับการค้นหาที่รู้จักไวยากรณ์และบริบทเชิงโครงสร้าง
- สัญลักษณ์ที่มีชื่อป้อนข้อมูลให้การค้นหาเชิงความหมายและการอ้างอิงไขว้ การนำทางกราฟจะใช้งานได้เมื่อเปิดใช้การสกัดความสัมพันธ์
- ภาษานี้ส่งสัญลักษณ์และความสัมพันธ์ไปยังการค้นหาแบบรู้บริบทกราฟ โดยประเภทเอดจ์ที่รองรับจะแตกต่างกันตามโครงสร้างเฉพาะของภาษา
- รองรับทั้งการแยกวิเคราะห์ AST และการสกัดสัญลักษณ์

## เหมาะที่สุดสำหรับ

- ทีมเฟิร์มแวร์ ระบบฝังตัว และระบบปฏิบัติการ ซึ่งการเปลี่ยนเล็กน้อยในฟังก์ชันที่ใช้ร่วมกันอาจส่งผลถึงเส้นทางฮาร์ดแวร์
- ไลบรารี C ที่ใช้งานมายาวนาน ซึ่งมีเฮดเดอร์สาธารณะ มาโคร export และทรานสเลชันยูนิตภายในจำนวนมาก
- การรีวิวที่มีเอเจนต์ช่วย ซึ่งคำถามคือ “ใครเรียกสิ่งนี้ และผ่านเฮดเดอร์ใด”

## เวิร์กโฟลว์ของเอเจนต์

- หาผู้เรียกทุกรายของฟังก์ชัน ก่อนเปลี่ยนซิกเนเจอร์หรือการจัดการข้อผิดพลาด
- ทำแผนที่ไฟล์ที่ include เฮดเดอร์หนึ่งและ struct ที่ไฟล์เหล่านั้นใช้
- ติดตามคำขอจากตัวจัดการอินเทอร์รัปต์ หรือจุดเริ่มต้น ผ่านฟังก์ชันที่คำขอไปถึง

## ทำไม C ต้องใช้กราฟการเรียก ไม่ใช่ grep

C ไม่มีคลาสหรือโมดูลสำหรับจัดระเบียบโค้ด โครงสร้างอยู่ในการเรียกฟังก์ชัน เฮดเดอร์ และ struct และชื่อเดียวกันอาจปรากฏในคอมเมนต์ มาโคร และสตริงลิเทอรัล มาโคร export และแอนโนเทชันห่อการประกาศไว้ ซึ่งทำให้เครื่องมือที่แยกวิเคราะห์ได้แค่ C ล้วนสะดุด สำหรับเอเจนต์ ขั้นแรกที่ปลอดภัยคือกราฟการเรียก

Maguyva สร้างกราฟนี้ เพื่อให้เอเจนต์เห็นว่าฟังก์ชันไปถึงที่ใด และอะไรไปถึงฟังก์ชันนั้น ก่อนเสนอการเปลี่ยนแปลง

## Maguyva ดึงอะไรจาก C ได้บ้าง

Maguyva ครอบคลุม `.c` และ `.h` นิยามฟังก์ชันถูกดึงออกมาเป็นสัญลักษณ์ และเลือก struct และ union เป็นนิยามชนิดข้อมูลในการค้นหาเชิงโครงสร้างได้ ไดเรกทีฟ `#include` กลายเป็นความสัมพันธ์การนำเข้า

มาโคร export และการมองเห็น (รูปแบบอย่าง `FOO_API`, `DLLEXPORT` หรือ `LIBEXPORT`) และมาโครแอนโนเทชันด้านความปลอดภัยของเธรด (เช่น `GUARDED_BY` และ `REQUIRES`) ถูกปิดบังก่อนแยกวิเคราะห์ การประกาศที่ถูกห่อไว้จึงแยกวิเคราะห์เป็นการประกาศปกติ ตัวมาโครแบบฟังก์ชันจะถูกแยกวิเคราะห์ ส่วนตัวมาโครแบบออบเจกต์จะไม่ถูกแยกวิเคราะห์

กราฟบันทึกการเรียก การ include การสร้างอินสแตนซ์ผ่านคอมพาวด์ลิเทอรัล การอ้างอิงชนิดข้อมูล การอ่านและการเขียน และโฟลว์การควบคุม การเรียกไลบรารีมาตรฐานของ C ราว 124 รายการ (`printf`, `malloc`, `free`, `memcpy`, `strlen` และอื่น ๆ ทำนองเดียวกัน) ถูกกรองออกจากความสัมพันธ์ เพื่อให้โค้ดของโปรเจกต์โดดเด่นขึ้นมา

## ตัวอย่างพรอมต์สำหรับเอเจนต์

- "ใครเรียก `uart_write` ทั้งโดยตรงและผ่านฟังก์ชันอื่น" (`dependency_search` ทิศทางขาเข้า)
- "ไฟล์ใด include `config.h` และใช้ struct ใดจากไฟล์นั้น" (`dependency_search` แล้วตามด้วย `find_symbol`)
- "อธิบายว่าแพ็กเก็ตเดินทางจากอินเทอร์รัปต์การรับข้อมูลไปยังตัวแยกวิเคราะห์โปรโตคอลอย่างไร" (`get_task_context`)

## ข้อจำกัดที่ทราบ

- C ไม่มีคลาสและไม่มีเอกซ์เซปชัน ความสัมพันธ์การสืบทอด การอิมพลีเมนต์อินเทอร์เฟซ การ override การ throw และการ catch จึงถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง
- `.h` อยู่ในรายการนามสกุลไฟล์ของ C, C++ และ Objective-C เฮดเดอร์ในโครงสร้างไฟล์ที่มีหลายภาษาจึงถูกแบ่งกันระหว่างโปรไฟล์เหล่านี้
- การเรียกฟังก์ชันไลบรารีมาตรฐานที่ถูกกรองไม่เป็นเส้นเชื่อมในกราฟ ใช้ `text_pattern_search` เมื่อต้องการทุก `malloc` หรือ `memcpy`

## ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) สำหรับโค้ด C++ ในโครงสร้างเดียวกัน ให้อ่าน[คู่มือภาษา C++](/th/languages/cpp)

## รายละเอียดเอนจิน

- การรองรับ C ครอบคลุม `.c` และ `.h` นิยามฟังก์ชันเป็นสัญลักษณ์ struct และ union เป็นนิยามชนิดข้อมูล และ `#include` กลายเป็นความสัมพันธ์การนำเข้า
- มาโคร export, การมองเห็น และแอนโนเทชันด้านความปลอดภัยของเธรดถูกปิดบังก่อนแยกวิเคราะห์ การประกาศที่ถูกห่อจึงแยกวิเคราะห์ได้ ตัวมาโครแบบฟังก์ชันถูกแยกวิเคราะห์ ส่วนแบบออบเจกต์ไม่ถูกแยกวิเคราะห์
- การเรียกไลบรารีมาตรฐานราว 124 รายการ เช่น `printf`, `malloc` และ `memcpy` ถูกกรองออก ความสัมพันธ์การสืบทอด การ override และเอกซ์เซปชันถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง

## จุดเริ่มต้น MCP ที่มีประโยชน์

- `find_symbol`: ใช้กับชื่อฟังก์ชันหรือ struct เมื่อต้องการนิยามและทุกการอ้างอิง
- `dependency_search`: ใช้การท่องกราฟทิศทางขาเข้าบนฟังก์ชันที่ใช้ร่วมกัน ก่อนเปลี่ยนซิกเนเจอร์หรือการจัดการข้อผิดพลาด
- `get_task_context`: ใช้กับพรอมต์อย่าง “อธิบายว่าแพ็กเก็ตเดินทางจากอินเทอร์รัปต์การรับข้อมูลไปยังตัวแยกวิเคราะห์โปรโตคอลอย่างไร”
