C++ Bridge Declarations

#[cxx::bridge] mod ffi { // C++ types and signatures exposed to Rust. unsafe extern "C++" { include!("include/blobstore.h"); type BlobstoreClient; fn new_blobstore_client() -> UniquePtr<BlobstoreClient>; fn put(self: Pin<&mut BlobstoreClient>, parts: &mut MultiBuf) -> u64; fn tag(self: Pin<&mut BlobstoreClient>, blobid: u64, tag: &str); fn metadata(&self, blobid: u64) -> BlobMetadata; } }

نتیجه (تقریبی) Rust در زیر است:

#[repr(C)] pub struct BlobstoreClient { _private: ::cxx::private::Opaque, } pub fn new_blobstore_client() -> ::cxx::UniquePtr<BlobstoreClient> { extern "C" { #[link_name = "org$blobstore$cxxbridge1$new_blobstore_client"] fn __new_blobstore_client() -> *mut BlobstoreClient; } unsafe { ::cxx::UniquePtr::from_raw(__new_blobstore_client()) } } impl BlobstoreClient { pub fn put(&self, parts: &mut MultiBuf) -> u64 { extern "C" { #[link_name = "org$blobstore$cxxbridge1$BlobstoreClient$put"] fn __put( _: &BlobstoreClient, parts: *mut ::cxx::core::ffi::c_void, ) -> u64; } unsafe { __put(self, parts as *mut MultiBuf as *mut ::cxx::core::ffi::c_void) } } } // ...

Speaker Notes

  • برنامه‌نویس نیازی به تضمینی در مورد درست بودن signatureهایی که تایپ کرده است ندارد. CXX اظهارات ثابتی را انجام می دهد که signatureها دقیقاً با آنچه در ++C اعلام شده مطابقت دارند.
  • بلوک‌های unsafe extern به شما امکان می‌دهند توابع ++C را که برای فراخوانی از Rust امن هستند را اعلام کنید.