Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

相互運用性

Rust と C のコードの相互運用性は、常に 2 つの言語の間でデータを変換することに依存します。 この目的のために、stdlib には 専用のモジュール std::ffi があります。

std::ffi は、charintlong などの C のプリミティブ型の型定義を提供します。 また、文字列のような、より複雑な型を変換するための いくつかのユーティリティも提供し、 &strString の両方を、 より簡単かつ安全に扱える C の型に対応付けます。

Rust 1.30 以降では、 std::ffi の機能は、 メモリ割り当てが関係するかどうかに応じて core::ffi または alloc::ffi のいずれかで利用できます。 cty クレートおよび cstr_core クレートも 同様の機能を提供します。

Rust の型中間型C の型
StringCStringchar *
&strCStrconst char *
()c_voidvoid
u32 または u64c_uintunsigned int
など

C のプリミティブ型の値は、 対応する Rust の型の 1 つとして使用でき、 その逆も同様です。 これは、前者が単に後者の型エイリアスだからです。 たとえば、次のコードは、 unsigned int が 32 ビット長であるプラットフォーム上で コンパイルできます。

fn foo(num: u32) {
    let c_num: c_uint = num;
    let r_num: u32 = c_num;
}

他のビルドシステムとの相互運用性

組み込みプロジェクトに Rust を含める際の一般的な要件は、 Cargo を、make や cmake などの既存のビルドシステムと 組み合わせることです。

この件に関する例やユースケースは、issue tracker の issue #61 で収集しています。

RTOS との相互運用性

FreeRTOS や ChibiOS のような RTOS と Rust を統合する作業は、 依然として進行中です。特に、Rust から RTOS の関数を呼び出すのは 難しい場合があります。

現在、次のプロジェクトが Rust<->RTOS の相互運用性を 公開サポートしています。

この件に関する例やユースケースは、issue tracker の issue #62 で収集しています。