主题
10.2 与 C/C++ 互操作(FFI)
Rust 提供了强大的 FFI(Foreign Function Interface),允许与 C/C++ 等语言进行互操作。通过 FFI,Rust 程序可以调用外部语言的函数,也可以将自身的函数导出供其他语言使用。
基本原理
Rust 的 FFI 是通过 extern
关键字和 #[no_mangle]
属性实现的,这些工具可以控制函数的名称和调用约定,使其符合 C ABI(应用二进制接口)的要求。
从 Rust 调用 C 函数
首先需要声明 C 函数的接口:
rust
extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
unsafe {
println!("abs(-3) = {}", abs(-3));
}
}
extern "C"
告诉编译器这段代码遵循 C 的调用约定。
从 C 调用 Rust 函数
Rust 函数需要使用 #[no_mangle]
防止名称被混淆,并指定 C 的调用约定:
rust
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}
然后可以从 C 文件中链接并调用它。
使用 bindgen(C 转 Rust)
bindgen
工具可自动生成 Rust 绑定代码以访问复杂的 C 头文件:
sh
cargo install bindgen
bindgen wrapper.h -o bindings.rs
这简化了手动声明 C 函数、结构体和类型的过程。
代码演示
vue
## 代码演示
<RustPlayground :code="code" />
<script setup>
const code = `extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
unsafe {
let value = abs(-42);
println!("abs(-42) = {}", value);
}
}`;
</script>
小结
- Rust 可安全与 C/C++ 交互,适合系统编程和底层优化。
unsafe
是 FFI 的必要部分,需格外小心。- 推荐使用
bindgen
自动生成绑定,提高效率和正确性。