我已经为 C 库创建了 rust 绑定,目前正在围绕它编写安全包装器。
问题是关于 C 函数,它接受不能接受任何自定义用户数据的 C 函数指针。
用一个例子更容易解释,
C 库:
// The function pointer I need to pass,
typedef void (*t_function_pointer_library_wants)(const char *argument);
// The function which I need to pass the function pointer to,
void register_hook(const t_function_pointer_library_wants hook);
绑定:
// For the function pointer type
pub type t_function_pointer_library_wants = ::std::option::Option<unsafe extern "C" fn(argument: *const ::std::os::raw::c_char)>;
// For the function which accepts the pointer
extern "C" {
pub fn register_hook(hook: t_function_pointer_library_wants);
}
如果我可以像下面这样向用户公开一个 api,那就太好了,
// Let's assume my safe wrapper is named on_something
// ..
on_something(|argument|{
// Do something with the argument..
});
// ..
尽管根据下面的消息来源,缺乏将存储我的闭包状态的内存部分的管理移交给 C 的能力,阻止了我创建这种 API。因为 C 中的函数指针是无状态的,不接受任何用户数据。(如果我错了,请纠正我。)
通过阅读这些资料和类似资料,我得出了这个结论:
作为后备,我也许可以想象像这样的 API,我传递一个函数指针。
fn handler(argument: &str) {
// Do something with the argument..
}
//..
on_something(handler);
//..
但我对转换一个有点困惑fn(&str)
,
到一个unsafe extern "C" fn(argument: *const std::os::raw::c_char)
..
如果您能指出正确的方向,我将非常高兴。
非常感谢。