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; } }

Speaker Notes

學生可能會想瞭解 out_qr_size 輸出內容的語意。這不是向量大小,而是 QR code 的大小 (誠然有點多餘,因為這是向量大小的平方根)。

可考慮說明先初始化 out_qr_size 再呼叫 Rust 函式的重要性。建立指向未初始化記憶體的 Rust 參照時,會導致「未定義的行為」(不同的是,在 C++ 中只有解除參照這類記憶體時才會導致「未定義的行為」)。

如有學生詢問 Pin,請說明為何 CXX 需要這個項目來處理 C++ 資料的可變動參照:答案是因為 C++ 資料可能包含自我參照指標,無法像 Rust 資料一樣移動。