Пример привязок
CXX требует, чтобы вся граница C++/Rust объявлялась в модулях cxx::bridge внутри исходного кода .rs.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[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 располагаются здесь
Обратите внимание:
- Хотя это выглядит как обычный модуль Rust
mod, процедурный макрос#[cxx::bridge]делает с ним сложные вещи. Сгенерированный код гораздо сложнее, хотя в вашем коде по-прежнему получаетсяmodс именемffi. - Нативная поддержка
std::unique_ptrиз C++ в Rust - Встроенная поддержка срезов Rust в C++
- Вызовы из C++ в Rust и типы Rust (в верхней части)
- Вызовы из Rust в C++ и типы C++ (в нижней части)
Распространённое заблуждение: кажется, что Rust разбирает заголовок C++, но это обманчиво. Этот заголовок Rust никогда не интерпретирует, а просто #include-ится в сгенерированный код C++ для компиляторов C++.