範例

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] 程序巨集會對其執行複雜作業。產生的程式碼較為複雜,但仍會導致程式碼中出現名為 ffimod
  • Rust 中對 C++ std::unique_ptr 的原生支援
  • C++ 中對 Rust 切片的原生支援
  • 從 C++ 到 Rust 的呼叫,以及 Rust 型別 (頂部)
  • 從 Rust 到 C++ 的呼叫,以及 C++ 型別 (底部)

常見誤解:它「看似」是由 Rust 剖析的 C++ 標頭,但這會造成誤導。這種標頭一律不會由 Rust 解譯,只是為了 C++ 編譯器的好處,而在產生的 C++ 程式碼中設為 #include