نمونه اتصال‌ها (Bindingها)

‏ CXX مستلزم آن است که کل مرز C++/Rust در ماژول‌های cxx::bridge در کد منبع .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>; } } // Definitions of Rust types and functions go here

Speaker Notes

اشاره کنید:

  • اگرچه این شبیه به یک mod معمولی Rust است، اما ماکرو رویه‌ای #[cxx::bridge] کارهای پیچیده‌ای برای آن انجام می‌دهد و کد تولید شده کمی پیچیده تر است - اگرچه این کار همچنان منجر به یک mod به نام ffi در کد شما می شود.
  • پشتیبانی Native در ++C برایstd::unique_ptrدر Rust
  • پشتیبانی Native برای Rust Slices در ++C
  • فراخوانی از ++C به Rust و تایپ‌های Rust (در قسمت بالا)
  • فراخوانی از Rust به ++C و تایپ‌های ++C (در قسمت پایین)

تصور نادرست رایج**: به نظر می‌رسد هِدِر ++C توسط Rust تجزیه می‌شود، اما این گمراه کننده است. این هِدِر هرگز توسط Rust تفسیر نمی‌شود، بلکه به سادگی #include در کد ++C تولید‌شده برای کامپایلرهای ++C است.