Обробка помилок CXX: Приклад з QR
Генератор 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-коду (і слід визнати, що це трохи зайве - це квадратний корінь з розміру вектора).
Варто звернути увагу на важливість ініціалізації out_qr_size
перед викликом функції Rust. Створення посилання у Rust, яке вказує на неініціалізовану пам'ять, призводить до Undefined Behavior (на відміну від C++, де лише акт розіменування такої пам'яті призводить до UB).
Якщо студенти запитають про Pin
, поясніть, навіщо він потрібен CXX для змінних посилань на дані C++: відповідь полягає в тому, що дані C++ не можна переміщати, як дані Rust, оскільки вони можуть містити самопосилальні вказівники.