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

Использование 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", точно так же, как мы делали вручную в предыдущем разделе.