我需要能够调用此函数,其中native_call_cb
由Haskell函数实现
typedef godot_variant (*native_call_cb)(void *, godot_array *);
void GDAPI godot_register_native_call_type(const char *p_call_type, native_call_cb p_callback);
godot_variant是一个结构
typedef struct {
uint8_t _dont_touch_that[GODOT_VARIANT_SIZE];
} godot_variant;
Haskell FFI不支持返回结构,所以我能做的最好是
godot_variant* (*native_call_cb)(void *, godot_array *)
使用
foreign import ccall "wrapper" (Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)) -> IO (FunPtr (Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)))
如何在不为每个函数定义C包装的情况下将Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)
转换为native_call_cb
类型的C函数指针?
E:如果我为每个函数定义一个包装器,那很简单:
foreign export ccall my_func :: Ptr () -> Ptr GodotArray -> IO (Ptr GodotVariant)
foreign import ccall "&my_func_wrapper" :: FunPtr (Ptr () -> Ptr GodotArray -> IO Void) -- placeholder for struct
和一个C包装器
godot_variant my_func_wrapper(void* desc, godot_array* array) {
return *my_func(desc, array);
}
这很麻烦,但