互操作性
Rust 和 C 代码之间的互操作性始终依赖于两种语言之间的数据转换。为此,stdlib
中有一个专门的模块叫做 std::ffi
。
std::ffi
为 C 原始类型提供类型定义,例如 char
、int
和 long
。它还提供了一些实用工具,用于转换更复杂的类型(例如字符串),将 &str
和 String
都映射到更容易、更安全处理的 C 类型。
从 Rust 1.30 开始,std::ffi
的功能在 core::ffi
或 alloc::ffi
中可用,具体取决于是否涉及内存分配。cty
crate 和 cstr_core
crate 也提供了类似的功能。
Rust 类型 | 中间类型 | C 类型 |
---|---|---|
String | CString | char * |
&str | CStr | const char * |
() | c_void | void |
u32 或 u64 | c_uint | unsigned int |
等等 | ... | ... |
C 原始类型的值可以用作相应的 Rust 类型,反之亦然,因为前者只是后者的类型别名。例如,以下代码在 unsigned int
为 32 位的平台上编译。
fn foo(num: u32) {
let c_num: c_uint = num;
let r_num: u32 = c_num;
}
与其他构建系统的互操作性
在嵌入式项目中包含 Rust 的一个常见要求是将 Cargo 与您现有的构建系统(例如 make 或 cmake)结合使用。
我们正在 issue #61 的问题跟踪器上收集这方面的示例和用例。
与 RTOS 的互操作性
将 Rust 与 RTOS(例如 FreeRTOS 或 ChibiOS)集成仍在进行中;特别是从 Rust 调用 RTOS 函数可能会很棘手。
我们正在 issue #62 的问题跟踪器上收集这方面的示例和用例。