0Pricing
C++ Academy · Lekcja

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

  1. extern C i ABI języka C
  2. Wywoływanie Pythona z C++ za pomocą pybind11
  3. Granice FFI między C++ i Rust
  4. Używanie SWIG do powiązań z wieloma językami
← Powrót do C++ Academy