مدیریت خطا 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) باشد.