CXX 錯誤處理:QR Code 範例
在 QR code 產生器這個範例中,布林值是用來表示成功與失敗,且成功結果可跨越 FFI 邊界傳遞:
#[cxx::bridge(namespace = "qr_code_generator")]
mod ffi {
extern "Rust" {
fn generate_qr_code_using_rust(
data: &[u8],
min_version: i16,
out_pixels: Pin<&mut CxxVector<u8>>,
out_qr_size: &mut usize,
) -> bool;
}
}
學生可能會想瞭解 out_qr_size
輸出內容的語意。這不是向量大小,而是 QR code 的大小 (誠然有點多餘,因為這是向量大小的平方根)。
可考慮說明先初始化 out_qr_size
再呼叫 Rust 函式的重要性。建立指向未初始化記憶體的 Rust 參照時,會導致「未定義的行為」(不同的是,在 C++ 中只有解除參照這類記憶體時才會導致「未定義的行為」)。
如有學生詢問 Pin
,請說明為何 CXX 需要這個項目來處理 C++ 資料的可變動參照:答案是因為 C++ 資料可能包含自我參照指標,無法像 Rust 資料一樣移動。