Exemplo de Bindings
O CXX requer que toda a fronteira C++/Rust seja declarada em mĂłdulos cxx::bridge
dentro do cĂłdigo-fonte .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>;
}
}
// DefiniçÔes de tipos e funçÔes Rust vão aqui
Aponte:
- Embora isso pareça um
mod
Rust regular, a macro procedural#[cxx::bridge]
faz coisas complexas com ele. O cĂłdigo gerado Ă© bastante sofisticado - embora isso ainda resulte em ummod
chamadoffi
em seu cĂłdigo. - Suporte nativo para
std::unique_ptr
do C++ no Rust - Suporte nativo para slices Rust no C++
- Chamadas do C++ para o Rust e tipos Rust (na parte superior)
- Chamadas do Rust para o C++ e tipos C++ (na parte inferior)
EquĂvocos comuns: Parece que um cabeçalho C++ estĂĄ sendo analisado pelo Rust, mas isso Ă© enganoso. Este cabeçalho nunca Ă© interpretado pelo Rust, mas simplesmente #include
d no cĂłdigo C++ gerado para o benefĂcio dos compiladores C++.