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

 那尼1_388 发布于 2022-12-04 03:57

我有一个使用这个函数原型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(演示).

1 个回答
  • 最好的解决方案是使用使用适当函数原型的头重新编译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(演示).

    2022-12-11 02:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有