在 Chromium 中使用 CXX

在 Chromium 中,我們會為每個要使用 Rust 的葉節點定義獨立的 #[cxx::bridge] mod。每個 rust_static_library 通常都需要一個值。只要將下列項目

cxx_bindings = [ "my_rust_file.rs" ]
   # 含有 #[cxx::bridge] 的檔案列表,而非所有原始碼檔案
allow_unsafe = true

新增至現有的 rust_static_library 目標,並搭配 crate_rootsources

C++ 標頭會在合理位置產生,因此您只需採用下列程式碼:

#include "ui/base/my_rust_file.rs.h"

您會在 //base 中發現一些公用函式,可將 Chromium C++ 型別轉換成 CXX Rust 型別,逆向轉換也可以,例如 SpanToRustSlice

學生可能會問:為何仍需要 allow_unsafe = true

籠統的答案是根據一般 Rust 標準,任何 C/C++ 程式碼都不「安全」。從 Rust 來回呼叫 C/C++ 可能會對記憶體執行任何作業,進而破壞 Rust 本身資料布局的安全性。在 C/C++ 互通性中如果出現「過多」unsafe 關鍵字,可能會傷害這類關鍵字的訊噪比,且具有爭議性,但嚴格來說,在 Rust 二進位檔中導入任何外來程式碼,都可能對 Rust 造成非預期行為。

詳細答案位於這個頁面頂端的圖表中:CXX 會在幕後產生 Rust unsafeextern "C" 函式,如同前一節中的手動操作。