範例
CXX 要求在 .rs
原始碼的 cxx::bridge
模組中宣告整個 C++/Rust 邊界。
#[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>;
}
}
// 這裡放 Rust 型別和函式的定義
請說明以下事項:
- 雖然這看起來像一般的 Rust
mod
,但#[cxx::bridge]
程序巨集會對其執行複雜作業。產生的程式碼較為複雜,但仍會導致程式碼中出現名為ffi
的mod
。 - Rust 中對 C++
std::unique_ptr
的原生支援 - C++ 中對 Rust 切片的原生支援
- 從 C++ 到 Rust 的呼叫,以及 Rust 型別 (頂部)
- 從 Rust 到 C++ 的呼叫,以及 C++ 型別 (底部)
常見誤解:它「看似」是由 Rust 剖析的 C++ 標頭,但這會造成誤導。這種標頭一律不會由 Rust 解譯,只是為了 C++ 編譯器的好處,而在產生的 C++ 程式碼中設為 #include
。