تمرین: قابلیت همکاری با ++C
قسمت اول
- در فایل Rust که قبلاً ایجاد کردهاید، یک
#[cxx::bridge]اضافه کنید که یک تابع را مشخص میکند که باید از++C فراخوانی شود که نامhello_from_rustدارد، بدون اینکه پارامتر و هیچ مقداری برگرداند. - تابع
hello_from_rustقبلی خود را برای حذفextern "C"و#[no_mangle]تغییر دهید. حالا این فقط یک تابع استاندارد Rust است. - هدف
gnخود را برای ایجاد این پیوندها (bindings) تغییر دهید. - در کد ++C خود، forward-declaration برای
hello_from_rustرا حذف کنید. در عوض، فایل هِدِر تولید شده را اضافه کنید. - Build و run!
قسمت دوم
ایده خوبی است که کمی با CXX بازی کنید. این به شما کمک می کند تا به این فکر کنید که Rust در Chromium واقعا چقدر انعطاف پذیر است.
برخی از چیزهایی که باید امتحان کنید:
- از Rust دوباره به ++C فراخوانی کنید. درنهایت شما نیاز خواهید داشت:
- یک فایل هِدِر اضافی که میتوانید از
cxx::bridgeخودinclude!را وارد کنید. شما باید تابع ++C خود را در آن فایل هِدِر جدید اعلام کنید. - یک بلوک
unsafeبرای فراخوانی چنین تابعی، یا به طور متناوب کلمه کلیدیunsafeرا در#[cxx::bridge]خود همانطور که در اینجا توضیح داده شده است. - همچنین ممکن است لازم باشد
#include "third_party/rust/cxx/v1/crate/include/cxx.h"را وارد کنید.
- یک فایل هِدِر اضافی که میتوانید از
- یک رشته++C را از ++C به Rust منتقل کنید.
- ارسال یک reference از یک C++ object به Rust .
- عمداً امضاهای تابع Rust را که از
#[cxx::bridge]مطابقت ندارند، دریافت کنید و به خطاهایی که می بینید عادت کنید. - عمداً امضاهای تابع ++C را که از
#[cxx::bridge]مطابقت ندارند، دریافت کنید و به خطاهایی که می بینید عادت کنید. - یک
std::unique_ptrاز نوعی از ++C را به Rust ارسال کنید، به طوری که Rust بتواند دارای یک C++ object باشد. - یک Rust object ایجاد کنید و آن را به ++C ارسال کنید تا ++C مالک آن باشد. (نکته: شما به یک
Boxنیاز دارید). - چند متد را در نوع ++C اعلام کنید. آنها را از Rust فراخوانی کنید.
- چند متد را در Rust type اعلام کنید. از ++C آنها را فراخوانی کنید.
قسمت سوم
اکنون نقاط قوت و محدودیتهای CXX interop را درک کردهاید، به چند مورد استفاده برای Rust در Chromium فکر کنید که در آن رابط به اندازه کافی ساده باشد. نحوه تعریف این رابط را ترسیم کنید.
کجا میتوان help پیدا کرد
As students explore Part Two, they're bound to have lots of questions about how
to achieve these things, and also how CXX works behind the scenes.
برخی از سؤالاتی که ممکن است با آن مواجه شوید:برخی از سوالاتی که ممکن است با آن مواجه شوید:
- من مشکلی در مقداردهی اولیه یک متغیر از نوع X با نوع Y میبینم، که در آن X و Y هر دو نوع تابع هستند. بخاطر اینکه تابع ++ C شما کاملاً با اعلان موجود در
cxx::bridgeشما مطابقت ندارد. - به نظر میرسد میتوانم آزادانه مراجع ++C را به منابع Rust تبدیل کنم. آیا این خطر UB را ندارد؟ برای تایپهای opaque CXX، خیر، زیرا اندازه آنها صفر است. برای انواع بیاهمیت CXX بله، ممکن است باعث UB شود، اگرچه طراحی CXX ساخت چنین نمونهای را بسیار دشوار میکند.