Tratamento de Erros no CXX: Exemplo QR
O gerador de cĂłdigo QR Ă© um exemplo onde um booleano Ă© usado para comunicar sucesso vs falha e onde o resultado bem-sucedido pode ser passado pela fronteira 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;
}
}
Os alunos podem estar curiosos sobre a semĂąntica da saĂda out_qr_size
. Este nĂŁo Ă© o tamanho do vetor, mas o tamanho do cĂłdigo QR (e, reconhecidamente, Ă© um pouco redundante - esta Ă© a raiz quadrada do tamanho do vetor).
Pode valer a pena destacar a importĂąncia de inicializar out_qr_size
antes de chamar a função Rust. A criação de uma referĂȘncia Rust que aponta para a memĂłria nĂŁo inicializada resulta em Comportamento Indefinido (ao contrĂĄrio do C++, quando apenas o ato de desreferenciar tal memĂłria resulta em UB).
Se os alunos perguntarem sobre Pin
, explique por que o CXX precisa dele para referĂȘncias mutĂĄveis a dados C++: a resposta Ă© que os dados C++ nĂŁo podem ser movidos como os dados Rust, porque podem conter ponteiros auto-referenciais.