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 um mod chamado ffi 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 #included no código C++ gerado para o benefício dos compiladores C++.