Exercise: Interoperability with C++
パート 1
- 先ほど作成した Rust ファイルに、C++ から呼び出す単一の関数を示す
#[cxx::bridge]
を追加します。これはhello_from_rust
という関数で、パラメータを受け取らず、値も返しません。 - Modify your previous
hello_from_rust
function to removeextern "C"
and#[unsafe(no_mangle)]
. This is now just a standard Rust function. gn
ターゲットを変更して、これらのバインディングをビルドします。- C++ コードで、
hello_from_rust
の前方宣言を削除し、代わりに生成されたヘッダー ファイルをインクルードします。 - ビルドして実行します。
パート 2
CXX を少し使ってみて、Chromium における Rust の柔軟性について理解を深めましょう。
以下を試してください。
- Rust から C++ を呼び出します。これには以下が必要です。
cxx::bridge
からinclude!
できる追加のヘッダー ファイル。その新しいヘッダー ファイルで C++ 関数を宣言する必要があります。- このような関数を呼び出す
unsafe
ブロック。または こちら に記載されているとおり、#[cxx::bridge]
内でunsafe
キーワードを指定する必要があります。 #include "third_party/rust/cxx/v1/crate/include/cxx.h"
も必要になるかもしれません。
- C++ から Rust に C++ 文字列を渡します。
- C++ オブジェクトへの参照を Rust に渡します。
- 意図的に
#[cxx::bridge]
と一致しないようにRust 関数のシグネチャを変更し、表示されるエラーに慣れるようにします。 - 意図的に
#[cxx::bridge]
と一致しないようにC++ 関数のシグネチャを変更し、表示されるエラーに慣れるようにします。 - なんらかの型の
std::unique_ptr
を C++ から Rust に渡して、Rust がいくつかの C++ オブジェクトを所有できるようにします。 - Rust オブジェクトを作成して C++ に渡して、C++ がそれを所有できるようにします(ヒント:
Box
が必要です)。 - C++ 型でいくつかのメソッドを宣言し、Rust から呼び出します。
- Rust 型に対していくつかのメソッドを宣言し、C++ から呼び出します。
パート 3
CXX の相互運用性の長所と制限事項について理解したところで、インターフェースが非常にシンプルな、Chromium での Rust のユースケースをいくつか考えてみましょう。このインターフェースをどのように定義すればよいか考えてみましょう。
参考情報
As students explore Part Two, they're bound to have lots of questions about how
to achieve these things, and also how CXX works behind the scenes.
次のような質問が寄せられる可能性があります。
- X と Y の両方が関数型である場合に、型 X の変数を型 Y で初期化すると問題が発生します。これは、C++ 関数が
cxx::bridge
内の宣言と完全に一致しないためです。 - C++ 参照を Rust 参照に自由に変換できるようですが、UB のリスクはないでしょうか?CXX の不透明型の場合、サイズがゼロであるため、そのリスクはありません。CXX のトリビアル型では UB が発生する可能性がありますが、CXX の設計上、そのような例を作成するのは非常に困難です。