背景
Rust 接入存量 C++ 代码是很多团队都会走的一步。
难点通常不在 extern "C",而在这些边界问题:
- 谁创建谁释放
- 错误如何跨边界传递
- 线程模型是否一致
基本原则
- FFI 边界尽量窄
- 数据结构扁平、可序列化
- 所有权规则在接口文档里写死
#[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 能带来渐进迁移收益,但边界规范必须比普通模块更严格。
跨语言最怕“默认约定”,最好全部显式化。
边界是系统最脆弱的地方,跨语言边界更是。