0Pricing
C++ Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Extern C และ C ABI
  2. การเรียกใช้ Python จาก C++ ผ่าน pybind11
  3. C++ สำหรับขอบเขตการเชื่อมต่อ Rust FFI
  4. การใช้ SWIG สำหรับการเชื่อมโยงหลายภาษา
← กลับไปที่ C++ Academy