互用性

Rust和C代码间的互用性始终取决于两种语言间的数据转换。为了实现互用性,在stdlib中,有两个专用模块,叫做std::ffistd::os::raw

std::os::raw处理底层的基本类型,这些类型可以被编译器隐式地转换,因为Rust和C之间的内存布局足够相似或相同。

std::ffi提供了一些工具去转换更复杂的类型,比如Strings,将&strString映射成更容易和安全处理的C类型。

这两个模块在core中都没有,但是你可以在cstr_core crate中找到一个std::ffi::{CStr,CString}#![no_std]兼容版本,大多数的std::os::raw类型在cty crate中。

Rust 类型中间类型C type
StringCString*char
&strCStr*const char
()c_voidvoid
u32 or u64c_uintunsigned int
etc......

像上面提到的基本类型都能被编译器隐式地转换。

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

与其它编译系统的互用性

在嵌入式项目中引入Rust的一个常见需求是,把Cargo结合进你现存的编译系统中,比如make或者cmake。

issue #61的issue tracker上,我们正在为这个需求收集例子和用例。

与RTOSs的互用性

将Rust和一个RTOS集成在一起,比如FreeRTOS或者ChibiOS仍然在进行中; 尤其是从Rust调用RTOS函数可能很棘手。

issue #62的issue tracker上,我们正为这件事收集例子和用例。