C ABI
ABI定义
场景
🚨 以下操作 = ABI 破坏
❌ 改函数参数顺序 ❌ 改参数类型(int → long) ❌ 改返回类型 ❌ 删除导出函数 ❌ 改 struct 布局 ❌ 改 enum 值含义
✅ 以下操作 = ABI 安全
✔ 新增函数 ✔ 新增 enum 值(不改旧值) ✔ 新增 struct 字段(在末尾 + size 字段) ✔ 修复实现 bug
安全策略
Opaque Handle (不透明指针)
这是 ABI 稳定之王 👑
typedef void* foo_handle;
C 永远不知道内部结构:
struct FooImpl {
int x;
std::vector
👉 内部怎么改都不影响 ABI
Struct Versioning (结构体版本化)
天真写法(不可扩展)
typedef struct {
int a;
int b;
} FooConfig;
✅ 工业级写法
typedef struct {
uint32_t size; // 必须
uint32_t version; // 可选
int a;
int b;
} FooConfig;
使用方式
FooConfig cfg = {
.size = sizeof(FooConfig),
.version = 1,
.a = 1,
.b = 2
};
C++ 内部判断
if (cfg.size >= offsetof(FooConfig, b) + sizeof(int)) {
// 可以安全访问 b
}
Windows / Vulkan / CUDA 都用这套