Использование 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.
Заголовки C++ будут генерироваться в разумном месте, так что вы можете просто написать
#include "ui/base/my_rust_file.rs.h"
В //base есть вспомогательные функции для преобразования типов C++ Chromium в типы Rust CXX и обратно, например SpanToRustSlice.
Студенты могут спросить: зачем всё-таки нужен allow_unsafe = true?
Общий ответ: ни один код C/C++ не является «безопасным» по обычным меркам Rust. Вызовы в C/C++ и обратно из Rust могут делать с памятью что угодно и подорвать безопасность собственных раскладок данных Rust. Наличие слишком большого количества ключевых слов unsafe во взаимодействии с C/C++ может ухудшить отношение сигнала к шуму для такого ключевого слова, и это спорный вопрос. Но строго говоря, введение любого стороннего кода в бинарный файл Rust может вызвать неожиданное поведение с точки зрения Rust.
Узкий ответ — на диаграмме вверху этой страницы: за кулисами CXX генерирует небезопасные функции unsafe и extern "C", точно так же, как мы делали вручную в предыдущем разделе.