تمرین: قابلیت همکاری با ++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 ساخت چنین نمونه‌ای را بسیار دشوار می‌کند.