نمونه اتصالها (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
اشاره کنید:
- اگرچه این شبیه به یک
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 است.