CXX エラーハンドリング: QR の例
QR コードジェネレーターは、成功と失敗の伝達に boolean が使われ、 成功した結果を FFI 境界をまたいで渡せる例です。
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[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 コードのサイズです(そして確かに少し冗長で、 これはベクターのサイズの平方根です)。
Rust 関数を呼び出す前に out_qr_size を初期化することの重要性を指摘する 価値があるかもしれません。未初期化メモリを指す Rust の参照を作成すると、 未定義動作になります(C++ とは異なり、C++ ではそのようなメモリを デリファレンスしたときにのみ UB になります)。
受講者が Pin について質問した場合は、CXX が C++ データへの可変参照に これを必要とする理由を説明してください。答えは、C++ データには自己参照 ポインターが含まれている可能性があるため、Rust データのように移動できない からです。