Ejemplos
CXX necesita que se declare todo el límite de C++ o Rust en los módulos cxx::bridge del código fuente .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>;
}
}
// Las definiciones de los tipos y las funciones de Rust se colocan aquí
Señala lo siguiente:
- Aunque parece un
modde Rust habitual, la macro de procedimiento#[cxx::bridge]es capaz de desempeñar tareas complejas. El código generado es bastante más sofisticado, aunque aun así da como resultado unmodllamadoffien el código. - Compatibilidad nativa con
std::unique_ptrde C++ en Rust. - Compatibilidad nativa con los slices de Rust en C++.
- Llamadas de C++ a Rust y tipos de Rust (en la parte superior).
- Llamadas de Rust a C++ y tipos de C++ (en la parte inferior).
Error común: Parece que Rust está analizando un encabezado de C++, pero no es así. Rust nunca interpreta este encabezado, sino que simplifica #included en el código C++ generado para ayudar a los compiladores de C++.