Приклади прив'язок

CXX вимагає, щоб вся межа C++/Rust була оголошена в модулях cxx::bridge у вхідному коді .rs.

#[cxx::bridge]
mod ffi {
    extern "Rust" {
        type MultiBuf;

        fn next_chunk(buf: &mut MultiBuf) -> &[u8];
    }

    unsafe extern "C++" {
        include!("example/include/blobstore.h");

        type BlobstoreClient;

        fn new_blobstore_client() -> UniquePtr<BlobstoreClient>;
        fn put(self: &BlobstoreClient, buf: &mut MultiBuf) -> Result<u64>;
    }
}

// Визначення типів та функцій Rust можна знайти тут

Вкажіть:

  • Хоча це виглядає як звичайний mod у Rust, процедурний макрос #[cxx::bridge] робить з ним складні речі. Згенерований код є дещо складнішим - хоча це все одно призведе до появи у вашому коді mod з назвою ffi.
  • Вбудована підтримка std::unique_ptr з C++ у Rust
  • Вбудована підтримка зрізів Rust у C++
  • Виклики з C++ на Rust та типи Rust (у верхній частині)
  • Виклики з Rust на C++ та типи C++ (у нижній частині)

Поширена помилка: Виглядає так, ніби заголовок C++ розбирається Rust'ом, але це оманлива думка. Цей заголовок ніколи не інтерпретується Rust'ом, а просто #included у згенерований C++ код на користь компіляторів C++.