استفاده از cxx در Chromium

در Chromium، یک #[cxx::bridge] mod مستقل برای هر برگ گره‌ای که می‌خواهیم از Rust استفاده کنیم را تعریف می‌کنیم. شما معمولاً برای هر rust_static_library یکی دارید. پس فقط اضافه کنید.

cxx_bindings = [ "my_rust_file.rs" ]
   # list of files containing #[cxx::bridge], not all source files
allow_unsafe = true

به هدف rust_static_library موجود در کنار crate_root و sources.

headerهای ++C در یک مکان منطقی تولید می‌شوند، بنابراین شما می‌توانید

#include "ui/base/my_rust_file.rs.h"

برخی از توابع کاربردی را در //base برای تبدیل به/از تایپ‌های ++Chromium C به انواع CXX Rust پیدا خواهید کرد --- برای مثال [SpanToRustSlice](https://source.chromium.org/chromium/chromium/src /+/main:base/containers/span_rust.h;l=21).

دانش‌آموزان ممکن است بپرسند --- چرا هنوز به allow_unsafe = true نیاز داریم؟

پاسخ کلی این است که هیچ کد ++C/C با استانداردهای معمول Rust "ایمن" نیست. فراخوانی مجدد و برگشتی به ++C/C از Rust ممکن است کارهای دلخواه را در حافظه انجام دهد و ایمنی طرح‌بندی داده‌های خود Rust را به خطر بیندازد. وجود کلمات کلیدی بسیار زیاد «ناامن» در تعامل ++C/C می‌تواند به نسبت سیگنال به نویز چنین کلمه کلیدی آسیب برساند و این [جنجال‌برانگیز]‌(https://steveklabnik.com/writing/the-cxx-debate) است، اما به طور دقیق، آوردن هر کد خارجی به یک باینری Rust می‌تواند باعث رفتار غیرمنتظره از دیدگاه Rust شود.

پاسخ دقیقق دردیاگرام بالای این صفحه نهفته است --- در پشت صحنه، CXX توابع Rust «ناامن» و extern "C" را درست مانند در بخش قبل به صورت دستی انجام دادیم.