C ABI

 

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 v; };

👉 内部怎么改都不影响 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 都用这套