教程 rust tutorial

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 自动生成绑定,提高效率和正确性。