# 10.2 与 C/C++ 互操作（FFI）

URL: https://caijiao.org/rust/10-extras/02-ffi
Source: docs/rust/10-extras/02-ffi.md
Description: Rust 支持通过 FFI 与 C/C++ 互操作，使得开发者可以在高性能需求下复用现有的 C 代码库或进行系统级编程。

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
## 代码演示

Rust Playground 示例代码


```

## 小结

- Rust 可安全与 C/C++ 交互，适合系统编程和底层优化。
- `unsafe` 是 FFI 的必要部分，需格外小心。
- 推荐使用 `bindgen` 自动生成绑定，提高效率和正确性。
