Granice FFI między C++ i Rust
Udostępniaj funkcje C++ do użycia przez Rust FFI i działaj także w przeciwnym kierunku
Granice FFI między C++ i Rust to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
C++ i Rust
Rust i C++ to kompilowane języki niskopoziomowe, ale mają różne ABI i niezgodne systemy typów. Zwykle współpracują za pośrednictwem mostu korzystającego z ABI języka C.
Rust do C++: extern "C"
Eksportuj funkcje Rusta za pomocą extern "C" i #[no_mangle].
// Rust
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}Wywoływanie Rusta z C++
Zadeklaruj funkcję Rusta w C++ i połącz program ze statyczną biblioteką Rusta.
// C++
extern "C" int add(int a, int b);
std::cout << add(2, 3);C++ do Rusta
W odwrotnym kierunku — Rust wywołuje C++. Owiń C++ w extern "C" i zadeklaruj funkcję w Ruście.
// C++
extern "C" int multiply(int a, int b) {
return a * b;
}
// Rust
extern "C" {
fn multiply(a: i32, b: i32) -> i32;
}Linkowanie bibliotek statycznych
Zbuduj crate Rusta jako staticlib lub cdylib i połącz go z kompilacją C++.
# Cargo.toml
[lib]
crate-type = ["staticlib"]Bindgen i Cbindgen
Automatycznie generuj deklaracje FFI:
- bindgen — generuje powiązania Rusta z nagłówków C++
- cbindgen — generuje nagłówki C/C++ z kodu Rusta
Crate cxx
Crate cxx zapewnia bezpieczniejszą interoperacyjność C++ i Rusta na wyższym poziomie abstrakcji. Zdefiniuj wspólny schemat, a cxx wygeneruje po obu stronach silnie typowane powiązania.
Własność pamięci przez FFI
Oba języki używają RAII, ale mają różne modele własności. Przekazuj dane będące własnością przez wartość, a dane pożyczone przez surowy wskaźnik — i udokumentuj, kto zwalnia poszczególne zasoby.
Łańcuchy znaków przez FFI
Rust String i C++ std::string są niezgodne. Używaj *const c_char (zakończonego znakiem null) albo (*const u8, usize) (wskaźnik i długość).
Wyjątki a panika
Paniki Rust i wyjątki C++ nie przekraczają bezpiecznie granicy FFI. Wyjątki C++ należy przechwytywać na granicy, a po stronie Rust używać std::panic::catch_unwind.
Integracja procesu budowania
Należy używać met systemu budowania: CMake wywołującego Cargo albo Cargo wywołującego CMake za pośrednictwem skryptu budowania (build.rs). Crate cxx obsługuje typowe wzorce.
Przykłady z praktyki
W wielu produkcyjnych bazach kodu łączy się C++ i Rust: Mozilla Firefox używa komponentów Rust wewnątrz silnika C++; Chromium eksperymentuje z modułami Rust; wiele bibliotek kryptograficznych udostępnia oba rodzaje powiązań.
Szybkie sprawdzenie
Który atrybut Rust wyłącza zmianę nazw, aby C/C++ mogło znaleźć symbol?
Podsumowanie
Współdziałanie C++ i Rust odbywa się za pośrednictwem ABI C. Należy używać extern "C" i #[no_mangle]. Powiązania należy generować za pomocą bindgen i cbindgen albo użyć crate'a cxx do tworzenia bezpieczniejszych mostów typowanych. Na granicy trzeba ostrożnie obsługiwać własność, napisy i paniki.
Często zadawane pytania
Czy lekcja „Granice FFI między C++ i Rust” jest bezpłatna?
Tak — pełny tekst „Granice FFI między C++ i Rust” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Granice FFI między C++ i Rust”?
Udostępniaj funkcje C++ do użycia przez Rust FFI i działaj także w przeciwnym kierunku Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Granice FFI między C++ i Rust”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- extern C i ABI języka C
- Wywoływanie Pythona z C++ za pomocą pybind11
- Granice FFI między C++ i Rust
- Używanie SWIG do powiązań z wieloma językami