Rust作为low level语言,能够写操作系统。而C语言作为写操作系统首选的语言,Rust兼容C的APIs也不是什么新鲜的事情。下面是一个Rust调用C标准库函数的例子:
use std::ffi::CString;
use std::ffi::CStr;
use std::os::raw::c_char;
extern "C" {
fn strlen(s: *const c_char) -> usize;
}
fn main() {
let rs = "hello world";
let cs = CString::new(rs).unwrap();
unsafe {
let len = strlen(cs.as_ptr());
println!("len: {}", len);
}
unsafe {
let nrs = CStr::from_ptr(cs.as_ptr());
println!("new rust string: {}", nrs.to_string_lossy());
}
}
Rust调用C函数时,需要注意:
- 需要
extern "C"{}的方式引入C的APIs. - Rust不支持原生的C类型,需要引入
std::os::raw库下的类型。 - 对于C的结构体类型和其他自定义类型,Rust必须使用
#[repr(C)]重新定义该类型,才能在Rust中使用。 - Rust调用
非标准库时,需要使用#[link(name = "xxx")], 并且需要在链接时指定库。 - Rust调用C函数时,编译器没办法进行严格的检查,所以需要使用
unsafe关键字标注。