CXX Error Handling: QR Example

QR コード生成ツールは、ブール値が成功または失敗を伝達し、成功の結果を 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 コードのサイズです(つまり、この情報は冗長であり、ベクターのサイズの平方根に相当します)。

Rust 関数を呼び出す前に out_qr_size を初期化することの重要性を説明しましょう。初期化されていないメモリを指す Rust 参照を作成すると、未定義の動作となります(そのようなメモリを逆参照する操作のみが UB になるC++ とは異なります)。

Pin について受講者から尋ねられた場合は、CXX が C++ データへの可変参照のために Pin を必要とする理由を説明します。つまり、C++ のデータには自己参照ポインタが含まれている可能性があるため、Rust のデータのように移動することができません。