我有一个使用这个函数原型的C库,我想在C++中使用它
int mlx_key_hook(void *win_ptr, int (*funct_ptr)(), void *param);
但实际上所要求的功能是
int funct_ptr(int keycode, void *param);
事实上我有这个问题:为什么在params中放空?
然后,我问你如何用适当的C++ funct_ptr调用这个函数?
还是我在更改了funct_ptr原型后重新编译了这个库?
这不起作用:
mlx_key_hook(win_ptr, [](int keycode, void *param) -> int { return 0; }, NULL);
这项工作,但这不是我想要的:
mlx_key_hook(win_ptr, []() -> int { return 0; }, NULL);
dasblinkenli.. 6
最好的解决方案是使用使用适当函数原型的头重新编译C++代码,即
int mlx_key_hook(void *win_ptr, int (*funct_ptr)(int keycode, void *param), void *param);
然后使用带有两个参数的lambda的代码片段进行编译.
另一种解决方案是使用reinterpret_cast
.虽然不允许使用重新解释的签名(未定义的行为)调用函数,但在允许调用之前将重新解释的指针转换回其原始签名.
typedef int (*funct_ptr_good)(int, void *); typedef int (*funct_ptr_bad)(); void foo(funct_ptr_bad fb) { // This is a C++ version of what your C library does funct_ptr_good fg = reinterpret_cast(fb); fg(12345, NULL); } int main() { funct_ptr_good fg = [] (int key, void * ptr) -> int { cout << key << " " << ptr << endl; return 0; }; // foo expects a pointer that takes no parameters, in the same way that your C library does foo(reinterpret_cast (fg)); return 0; }
以上打印12345 0
(演示).
最好的解决方案是使用使用适当函数原型的头重新编译C++代码,即
int mlx_key_hook(void *win_ptr, int (*funct_ptr)(int keycode, void *param), void *param);
然后使用带有两个参数的lambda的代码片段进行编译.
另一种解决方案是使用reinterpret_cast
.虽然不允许使用重新解释的签名(未定义的行为)调用函数,但在允许调用之前将重新解释的指针转换回其原始签名.
typedef int (*funct_ptr_good)(int, void *); typedef int (*funct_ptr_bad)(); void foo(funct_ptr_bad fb) { // This is a C++ version of what your C library does funct_ptr_good fg = reinterpret_cast<funct_ptr_good>(fb); fg(12345, NULL); } int main() { funct_ptr_good fg = [] (int key, void * ptr) -> int { cout << key << " " << ptr << endl; return 0; }; // foo expects a pointer that takes no parameters, in the same way that your C library does foo(reinterpret_cast<funct_ptr_bad>(fg)); return 0; }
以上打印12345 0
(演示).