Приклади прив'язок
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'ом, а просто #include
d у згенерований C++ код на користь компіляторів C++.