Example Bindings
CXX requires that the whole C++/Rust boundary is declared in cxx::bridge modules inside .rs source code.
#[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>;}}// Definitions of Rust types and functions go here
Point out:
- Although this looks like a regular Rust
mod, the#[cxx::bridge]procedural macro does complex things to it. The generated code is quite a bit more sophisticated - though this does still result in amodcalledffiin your code. - Native support for C++’s
std::unique_ptrin Rust - Native support for Rust slices in C++
- Calls from C++ to Rust, and Rust types (in the top part)
- Calls from Rust to C++, and C++ types (in the bottom part)
Common misconception: It looks like a C++ header is being parsed by Rust, but this is misleading. This header is never interpreted by Rust, but simply #included in the generated C++ code for the benefit of C++ compilers.