Exercise: Interoperability with C++
パート 1
- 先ほど作成した Rust ファイルに、C++ から呼び出す単一の関数を示す
#[cxx::bridge]を追加します。これはhello_from_rustという関数で、パラメータを受け取らず、値も返しません。 - Modify your previous
hello_from_rustfunction 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 の設計上、そのような例を作成するのは非常に困難です。