01-在 Rust 中使用一点 C
在 Rust 中使用一点 C(A little C with your Rust)
1分钟内可阅读完
译文 · 基于 The Embedded Rust Book
原文链接: https://doc.rust-lang.org/stable/embedded-book/interoperability/
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 tracker 的 issue #61 中收集这方面的示例与用例。
将 Rust 与 FreeRTOS 或 ChibiOS 等 RTOS 集成仍在进行中;尤其是从 Rust 调用 RTOS 函数可能比较棘手。
目前,以下项目公开支持 Rust 与 RTOS 的互操作:
我们正在 issue tracker 的 issue #62 中收集这方面的示例与用例。
在 Rust 中使用一点 C(A little C with your Rust)
在 C 中使用一点 Rust(A little Rust with your C)