FFI 回调和 void *ctx
C 里的回调接口通常长这样:
typedef void (*event_cb_t)(void *ctx, int event);
int device_register_callback(struct device *dev, event_cb_t cb, void *ctx);
void device_unregister_callback(struct device *dev);
这个设计很常见:函数指针负责执行,ctx 负责保存调用方环境。
Rust 内部可以用 closure 表达“代码 + 环境”。但跨 C ABI 时,捕获环境的 closure 不能直接变成 C 函数指针。C 只认识固定 ABI 的函数地址和一个 void *ctx。