C++ 如何在c+;中使用c空括号函数+;?
我有一个C库,它使用这个函数原型,我想在C中使用它++ 但实际上,所要求的功能是C++ 如何在c+;中使用c空括号函数+;?,c++,c,gcc,C++,C,Gcc,我有一个C库,它使用这个函数原型,我想在C中使用它++ 但实际上,所要求的功能是 int funct_ptr(int keycode, void *param); 事实上,我有这个问题: 那么,我问你,如何用适当的C++函数TPtR?/P>调用这个函数? 或者在更改了funct_ptr原型之后,我必须重新编译这个库吗 这不起作用: mlx_key_hook(win_ptr, [](int keycode, void *param) -> int { return 0; },
int funct_ptr(int keycode, void *param);
事实上,我有这个问题:
那么,我问你,如何用适当的C++函数TPtR?/P>调用这个函数? 或者在更改了funct_ptr原型之后,我必须重新编译这个库吗
这不起作用:mlx_key_hook(win_ptr, [](int keycode, void *param) -> int {
return 0;
}, NULL);
mlx_key_hook(win_ptr, []() -> int {
return 0;
}, NULL);
这是我的工作,但那不是我想要的:
mlx_key_hook(win_ptr, [](int keycode, void *param) -> int {
return 0;
}, NULL);
mlx_key_hook(win_ptr, []() -> int {
return 0;
}, NULL);
<>最好的解决方案是用一个使用适当函数原型的标题重新编译C++代码,即
int mlx_key_hook(void *win_ptr, int (*funct_ptr)(int keycode, void *param), void *param);
然后,将编译带有两个参数的lambda的代码段
另一个解决方案是使用重新解释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;
}
typedef int(*函数ptr_好)(int,void*);
typedef int(*functt_ptr_bad)();
失效失效失效(失效失效失效失效){
//这是C++库的C++版本
funct_ptr_good fg=重新解释演员阵容(fb);
fg(12345,空);
}
int main(){
funct_ptr_good fg=[](int键,void*ptr)->int{
C库不需要2-arg函数指针,所以这就是第一个函数不起作用的原因。您必须请求一个新函数来接受C库中带有int
和void*
参数的函数。您必须强制转换函数指针。我将尝试强制转换thank You@alanstokeoon!您做得很好当你说最好的解决方案是重新编译你的C++代码时,你的意思是最好的解决方案是重新编译你的C库,不是吗?@新的原型的煤油重新编译C库不会改变任何东西,因为“用空括号声明的函数”拿走了我通过的任何东西。在C.中已经工作的那个函数,你在C++代码中包含的头是C++库的C++所能说明的内容。所以C++只是一个需要正确签名而不是C代码的C++代码,它完全符合<代码> RealTytPraseTM(函数TPTR)< /代码>非常感谢!祝您有个美好的一天: