如何在 C++ 中使用 C 空括号函数

how can I use c empty parentheses function, in c++?

本文关键字:函数 C++      更新时间:2023-10-16

我有一个使用这个函数原型C 库,我想在 C++

int mlx_key_hook(void *win_ptr, int (*funct_ptr)(), void *param);

但实际上,要求的功能是

int funct_ptr(int keycode, void *param);

事实上,我有这个问题:为什么要在参数中放置空?

然后,我问你如何使用适当的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);

最好的解决方案是使用使用适当函数原型的标头重新编译您的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(演示(。