互操作性
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 类型 |
---|---|---|
字符串 | 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)结合使用。
我们正在我们的问题跟踪器中收集有关此方面的示例和用例,在 问题 #61 中。
与 RTOS 的互操作性
将 Rust 与 FreeRTOS 或 ChibiOS 等 RTOS 集成仍在进行中;特别是从 Rust 调用 RTOS 函数可能很棘手。
我们正在我们的问题跟踪器中收集有关此方面的示例和用例,在 问题 #62 中。