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.