مدیریت خطا 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 است (و مسلماً کمی اضافی است - درواقع این جذر اندازه بردار است).
شاید لازم باشد قبل از فراخوانی تابع Rust به اهمیت مقداردهی اولیه out_qr_size
اشاره کنیم. ایجاد یک مرجع Rust که به حافظه اولیه اشاره میکند، منجر به رفتار نامشخص میشود (برخلاف ++C، زمانی که تنها عمل عدم ارجاع چنین حافظهای منجر به UB میشود).
اگر دانشآموزان درباره Pin
سؤال میکنند، توضیح دهید که چرا CXX برای ارجاعهای قابل تغییر به دادههای ++C به آن نیاز دارد: پاسخ این است که دادههای++C را نمیتوان مانند دادههای Rust جابهجا کرد، زیرا ممکن است حاوی نشانگرهای خودارجاعی (self-referential pointers) باشد.