Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c+;中使用c空括号函数+;?_C++_C_Gcc - Fatal编程技术网

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; },

我有一个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;

}, 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)< /代码>非常感谢!祝您有个美好的一天: