Обробка помилок 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; } }

Speaker Notes

Студентам може бути цікаво дізнатися про семантику виведення out_qr_size. Це не розмір вектора, а розмір QR-коду (і слід визнати, що це трохи зайве - це квадратний корінь з розміру вектора).

Варто звернути увагу на важливість ініціалізації out_qr_size перед викликом функції Rust. Створення посилання у Rust, яке вказує на неініціалізовану пам’ять, призводить до Undefined Behavior (на відміну від C++, де лише акт розіменування такої пам’яті призводить до UB).

Якщо студенти запитають про Pin, поясніть, навіщо він потрібен CXX для змінних посилань на дані C++: відповідь полягає в тому, що дані C++ не можна переміщати, як дані Rust, оскільки вони можуть містити самопосилальні вказівники.