練習:與 C++ 的互通性

第一部分

  • 在您先前建立的 Rust 檔案中新增 #[cxx::bridge],指定要從 C++ 呼叫的單一函式 (名為 hello_from_rust),但不採用任何參數,也不會傳回值。
  • 修改先前的 hello_from_rust 函式,移除 extern "C"#[no_mangle]。現在這樣就只是標準的 Rust 函式。
  • 修改 gn 目標,建構這些繫結。
  • 在 C++ 程式碼中,移除 hello_from_rust 的前向宣告,改為納入產生的標頭檔案。
  • 建構並執行!

第二部分

您可以試著玩玩 CXX,這有助於瞭解 Chromium 中的 Rust 有多靈活。

可嘗試的事項:

  • 從 Rust 呼叫 C++。您會需要以下項目:
    • 額外的標頭檔案,可從 cxx::bridgeinclude!。您會需要在新標頭檔案中宣告 C++ 函式。
    • 用於呼叫這類函式的 unsafe 區塊,或者可在 #[cxx::bridge] 中指定 unsafe 關鍵字,如這個頁面所述
    • 您可能也需要 #include "third_party/rust/cxx/v1/crate/include/cxx.h"
  • 將 C++ 字串從 C++ 傳遞至 Rust。
  • 將 C++ 物件的參照傳遞至 Rust。
  • 刻意從 #[cxx::bridge] 中,取得不相符的 Rust 函式簽章,並熟悉看到的錯誤。
  • 刻意從 #[cxx::bridge] 中取得不相符的 C++ 函式簽章,並熟悉看到的錯誤。
  • 將某些型別的 std::unique_ptr 從 C++ 傳遞至 Rust,這樣 Rust 就能擁有某些 C++ 物件。
  • 建立 Rust 物件並傳遞至 C++ 中,讓 C++ 擁有該物件 (提示:您需要 Box)。
  • 在 C++ 型別上宣告一些方法,然後從 Rust 呼叫。
  • 在 Rust 型別上宣告一些方法,然後從 C++ 呼叫。

第三部分

現在您已瞭解 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 的「opaque」型別就不會,因為這種型別的大小為零。CXX 中的 trivial 型別則「有可能」造成 UB,雖然 CXX 的設計讓撰寫這類範例相當困難。