背景

Rust 接入存量 C++ 代码是很多团队都会走的一步。

难点通常不在 extern "C",而在这些边界问题:

  • 谁创建谁释放
  • 错误如何跨边界传递
  • 线程模型是否一致

基本原则

  1. FFI 边界尽量窄
  2. 数据结构扁平、可序列化
  3. 所有权规则在接口文档里写死
#[no_mangle]
pub extern "C" fn sum(a: i32, b: i32) -> i32 {
    a + b
}
extern "C" int32_t sum(int32_t a, int32_t b);

总结

FFI 能带来渐进迁移收益,但边界规范必须比普通模块更严格。

跨语言最怕“默认约定”,最好全部显式化。


边界是系统最脆弱的地方,跨语言边界更是。