C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI
เปิดเผยฟังก์ชัน C++ ให้ Rust เรียกใช้ผ่าน FFI และรองรับการเรียกย้อนกลับ
C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
C++ และ Rust
Rust และ C++ ต่างก็เป็นภาษาระดับต่ำที่ผ่านการคอมไพล์ แต่มี ABI และระบบชนิดข้อมูลที่แตกต่างและเข้ากันไม่ได้ โดยทั่วไปทั้งสองภาษาจะเชื่อมการทำงานผ่านสะพาน ABI ของ C
Rust ไปยัง C++: extern "C"
ส่งออกฟังก์ชัน Rust ด้วย extern "C" และ #[no_mangle]
// Rust
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}C++ เรียก Rust
ประกาศฟังก์ชัน Rust ใน C++ แล้วเชื่อมโยงกับไลบรารีแบบสแตติกของ Rust
// C++
extern "C" int add(int a, int b);
std::cout << add(2, 3);C++ ไปยัง Rust
ทิศทางย้อนกลับ — Rust เรียก C++ ห่อหุ้ม C++ ด้วย extern "C" แล้วประกาศใน Rust
// C++
extern "C" int multiply(int a, int b) {
return a * b;
}
// Rust
extern "C" {
fn multiply(a: i32, b: i32) -> i32;
}การเชื่อมโยงไลบรารีแบบสแตติก
สร้าง crate ของ Rust เป็น staticlib หรือ cdylib แล้วเชื่อมโยงเข้ากับการสร้าง C++
# Cargo.toml
[lib]
crate-type = ["staticlib"]Bindgen และ Cbindgen
สร้างประกาศ FFI โดยอัตโนมัติ:
- bindgen — สร้างส่วนเชื่อมโยง Rust จากไฟล์ส่วนหัว C++
- cbindgen — สร้างไฟล์ส่วนหัว C/C++ จากโค้ด Rust
แพ็กเกจ cxx
แพ็กเกจ cxx มอบการเชื่อมการทำงานระหว่าง C++ กับ Rust ในระดับสูงที่ปลอดภัยยิ่งขึ้น ประกาศโครงร่างร่วม แล้ว cxx จะสร้างส่วนเชื่อมโยงทั้งสองฝั่งโดยใช้การตรวจชนิดข้อมูลอย่างเข้มงวด
ความเป็นเจ้าของหน่วยความจำข้าม FFI
ทั้งสองภาษามี RAII แต่ใช้รูปแบบความเป็นเจ้าของที่แตกต่างกัน ส่งข้อมูลที่เป็นเจ้าของด้วยค่า และส่งข้อมูลที่ยืมมาด้วยตัวชี้ดิบ — พร้อมระบุให้ชัดเจนว่าใครเป็นผู้คืนหน่วยความจำใด
สตริงข้าม FFI
Rust String และ C++ std::string เข้ากันไม่ได้ ให้ใช้ *const c_char (ลงท้ายด้วยค่าว่าง) หรือ (*const u8, usize) (ตัวชี้ + ความยาว)
ข้อยกเว้นกับการหยุดทำงานแบบ panic
การหยุดทำงานแบบ panic ของ Rust และข้อยกเว้นของ C++ ไม่สามารถข้าม FFI ได้อย่างปลอดภัย โปรดดักจับข้อยกเว้นของ C++ ที่ขอบเขต และใช้ std::panic::catch_unwind ทางฝั่ง Rust
การผสานรวมการสร้าง
โปรดใช้ระบบเมตาบิลด์ เช่น ให้ CMake เรียก Cargo หรือให้ Cargo เรียก CMake ผ่านสคริปต์สร้าง (build.rs) แพ็กเกจ cxx จัดการรูปแบบการใช้งานทั่วไปให้
ตัวอย่างจากการใช้งานจริง
โค้ดเบสที่ใช้งานจริงจำนวนมากผสมผสาน C++ กับ Rust เช่น Mozilla Firefox ใช้ส่วนประกอบ Rust ภายในเอนจิน C++ ส่วน Chromium กำลังทดลองใช้มอดูล Rust และไลบรารีการเข้ารหัสจำนวนมากก็มีตัวเชื่อมโยงสำหรับทั้งสองภาษา
ตรวจสอบความเข้าใจ
แอตทริบิวต์ใดของ Rust ที่ปิดใช้การปรับเปลี่ยนชื่อ เพื่อให้ C/C++ ค้นหาสัญลักษณ์ได้
สรุป
C++ และ Rust ทำงานร่วมกันผ่าน C ABI โปรดใช้ extern "C" และ #[no_mangle] สร้างตัวเชื่อมโยงด้วย bindgen และ cbindgen หรือใช้แพ็กเกจ cxx เพื่อสร้างสะพานเชื่อมแบบมีชนิดข้อมูลที่ปลอดภัยกว่า จัดการความเป็นเจ้าของ สตริง และการหยุดทำงานแบบ panic ข้ามขอบเขตอย่างระมัดระวัง
คำถามที่พบบ่อย
บทเรียน “C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI”
เปิดเผยฟังก์ชัน C++ ให้ Rust เรียกใช้ผ่าน FFI และรองรับการเรียกย้อนกลับ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Extern C และ C ABI
- การเรียกใช้ Python จาก C++ ผ่าน pybind11
- C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI
- การใช้ SWIG สำหรับการเชื่อมโยงหลายภาษา