Використання cxx у Chromium
У Chromium ми визначаємо незалежний #[cxx::bridge] mod
для кожного листового вузла, де ми хочемо використовувати Rust. Зазвичай у вас буде по одному модулю для кожної rust_static_library
. Просто додайте
cxx_bindings = [ "my_rust_file.rs" ]
# список файлів, що містять #[cxx::bridge], не всі вхідні файли
allow_unsafe = true
до вашої існуючої цілі rust_static_ibrary
разом з crate_root
та sources
.
C++ заголовки будуть згенеровані в доцільному місці, тому ви можете просто
#include "ui/base/my_rust_file.rs.h"
У //base
ви знайдете деякі утиліти для перетворення типів Chromium C++ у типи CXX Rust --- наприклад SpanToRustSlice
.
Студенти можуть запитати --- навіщо нам все ще потрібно allow_unsafe = true
?
Загальна відповідь полягає у тому, що жоден C/C++ код не є "безпечним" за звичайними стандартами Rust. Виклик C/C++ з Rust може призвести до довільних дій з пам'яттю та поставити під загрозу безпеку власних структур даних Rust. Наявність занадто unsafe
ключових слів у взаємодії C/C++ може погіршити співвідношення сигнал/шум такого ключового слова, що є суперечливим, але строго кажучи, внесення будь-якого стороннього коду у бінарний файл Rust може спричинити неочікувану поведінку з точки зору Rust'у.
Вузька відповідь міститься на діаграмі у верхній частині цієї сторінки --- за завісою CXX генерує unsafe
та extern "C"
функції Rust так само, як ми робили це вручну у попередньому розділі.