Приклади прив’язок
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++.