استفاده از 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"
را درست مانند در بخش قبل به صورت دستی انجام دادیم.