Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Упражнение: взаимодействие с C++

Часть первая

  • В файле Rust, который вы создали ранее, добавьте #[cxx::bridge], в котором указана одна функция, вызываемая из C++, hello_from_rust, без параметров и без возвращаемого значения.
  • Измените вашу прежнюю функцию hello_from_rust, убрав extern "C" и #[unsafe(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.
  • Передайте ссылку на объект C++ в Rust.
  • Намеренно сделайте сигнатуры функций 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. Не рискует ли это неопределённым поведением? Для непрозрачных (opaque) типов CXX — нет, потому что они имеют нулевой размер. Для тривиальных типов CXX — да, вызвать UB возможно, хотя конструкция CXX делает такой пример довольно трудным для создания.