Usando CXX no Chromium
No Chromium, definimos um #[cxx::bridge] mod
independente para cada nó folha onde queremos usar o Rust. Normalmente, você teria um para cada rust_static_library
. Basta adicionar
cxx_bindings = [ "my_rust_file.rs" ]
# list of files containing #[cxx::bridge], not all source files
allow_unsafe = true
para o seu alvo rust_static_library
existente ao lado de crate_root
e sources
.
Cabeçalhos C++ serão gerados em um local sensato, então você pode apenas
#include "ui/base/my_rust_file.rs.h"
Você encontrará algumas funções utilitárias em //base
para converter de/ para tipos C++ do Chromium para tipos Rust CXX --- por exemplo SpanToRustSlice
.
Os alunos podem perguntar --- por que ainda precisamos de allow_unsafe = true
?
A resposta mais geral é que nenhum código C/C++ é "seguro" pelos padrões normais do Rust. Chamar C/C++ a partir do Rust pode fazer coisas arbitrárias na memória e comprometer a segurança dos próprios layouts de dados do Rust. A presença de muitas palavras-chave unsafe
na interoperabilidade C/C++ pode prejudicar a relação sinal-ruído de tal palavra-chave e é controversa, mas estritamente, trazer qualquer código externo para um binário Rust pode causar um comportamento inesperado do ponto de vista do Rust.
A resposta mais específica está no diagrama no topo desta página --- nos bastidores, o CXX gera funções Rust unsafe
e extern "C"
exatamente como fizemos manualmente na seção anterior.