相互運用性
RustとCとの相互運用性は、常に2つの言語間のデータ変換に依存しています。
そこで、2つの専用モジュールがstdlib
内にあります。
std::ffi
と
std::os::raw
と呼ばれるものです。
std::os::raw
は、コンパイラによって暗黙的に変換される低レベルのプリミティブ型を扱います。
RustとCとの間で、これらのプリミティブ型のメモリレイアウトは十分似ているか、同じだからです。
std::ffi
は、文字列のようなより複雑な型を変換し、&str
とString
の両方を、
より扱いやすく安全なCの型にマッピングするためのユーティリティを提供します。
これらの2つのモジュールは、どちらもcore
では利用できませんが、
#![no_std]
互換バージョンのstd::ffi::{CStr,CString}
が、cstr_core
クレートにあります。
そして、ほとんどのstd::os::raw
の型は、cty
クレートにあります。
Rustの型 | 中間表現 | Cの型 |
---|---|---|
String | CString | *char |
&str | CStr | *const char |
() | c_void | void |
u32 or u64 | c_uint | unsigned int |
他 | ... | ... |
上述の通り、プリミティブ型は、コンパイラによって暗黙的に変換されます。
unsafe fn foo(num: u32) {
let c_num: c_uint = num;
let r_num: u32 = c_num;
}
他のビルドシステムとの相互運用性
組込みプロジェクトにRustを組み込むための共通の要件は、Cargoとmakeやcmakeのような既存のビルドシステムとを組み合わせることです。
issue #61でこれに関する事例とユースケースを集めています。
RTOSとの相互運用性
RustをFreeRTOSやChibiOSといったRTOSに統合することは、まだ作業を進めている状態です。 特に、RTOSの関数をRustから呼び出すことはトリッキーです。
issue #62でこれに関する事例とユースケースを集めています。