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
mod
de 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 unmod
llamadoffi
en el código. - Compatibilidad nativa con
std::unique_ptr
de 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 #include
d en el código C++ generado para ayudar a los compiladores de C++.