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

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 можна знайти тут

Speaker Notes

Вкажіть:

  • Хоча це виглядає як звичайний 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++.