Вправа: Інтероперабельність з C++
Частина перша
- У створений раніше файл Rust додайте
#[cxx::bridge]
, який визначає єдину функцію для виклику з C++ під назвоюhello_from_rust
, яка не отримує параметрів і не повертає жодного значення. - Змініть вашу попередню функцію
hello_from_rust
, видалившиextern "C"
і#[no_mangle]
. Тепер це просто стандартна функція Rust. - Змініть вашу ціль
gn
, щоб створити ці прив'язки. - У вашому C++ коді видаліть форвардне оголошення
hello_from_rust
. Замість цього додайте згенерований заголовний файл. - Будуємо і запускаємо!
Частина друга
Це гарна ідея - трохи погратися з CXX. Це допоможе вам зрозуміти, наскільки гнучким є Rust у Chromium.
Декілька речей, які варто спробувати:
- Зворотний виклик у C++ з Rust. Вам знадобиться:
- Додатковий заголовний файл, який ви можете
include!
до вашогоcxx::bridge
. Вам потрібно буде оголосити вашу функцію C++ у цьому новому заголовному файлі. unsafe
блок для виклику такої функції, або вкажіть ключове словоunsafe
у вашому#[cxx::bridge]
як описано тут.- Вам також може знадобитися
#include "third_party/rust/cxx/v1/crate/include/cxx.h"
- Додатковий заголовний файл, який ви можете
- Передати рядок C++ з C++ у Rust.
- Передати в Rust посилання на об'єкт C++.
- Навмисно зробити так, щоб сигнатури функцій Rust не співпадали з
#[cxx::bridge]
, і звикати до помилок, які ви побачите. - Навмисно зробити так, щоб сигнатури функцій C++ не співпадали з
#[cxx::bridge]
, і звикати до помилок, які ви побачите. - Передати
std::unique_ptr
деякого типу з C++ у Rust, щоб Rust міг володіти деяким об'єктом C++. - Створити об'єкт Rust і передати його в C++ так, щоб C++ володів ним. (Підказка: вам потрібен
Box
). - Оголосити деякі методи на типі C++. Викликати їх з Rust.
- Оголосити декілька методів на типі Rust. Викликати їх з C++.
Частина третя
Тепер, коли ви розумієте сильні та слабкі сторони взаємодії CXX, подумайте про пару варіантів використання Rust у Chromium, де інтерфейс був би достатньо простим. Накидайте ескіз того, як ви могли б визначити цей інтерфейс.
Де знайти допомогу
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? Для непрозорих типів CXX - ні, тому що вони мають нульовий розмір. Для тривіальних типів CXX так, це можливо спричинити UB, хоча дизайн CXX робить досить складним створення такого прикладу.