c++ - 将 C++ 函数指针转换为 c 函数指针

标签 c++ c pointers function-pointers

我正在使用 C 库开发 C++ 应用程序。我必须向 C 库发送一个指向函数的指针。

这是我的课:

 class MainWindow : public QMainWindow {  
     Q_OBJECT  
     public:  
     explicit MainWindow(QWidget *parent = 0);  
     private:  
     Ui::MainWindow *ui;
     void f(int*);

 private slots:
     void on_btn_clicked(); 
};

这是我的 on_btn_clicked 函数:

void MainWindow::on_btn_clicked()
{
    void (MainWindow::* ptfptr) (int*) = &MainWindow::f;

    c_library_function(static_cast<void()(int*)>(ptfptr), NULL);

}

C 函数应该获得指向此类函数的指针:void f(int*)。 但是上面的代码不起作用,我无法成功将我的 f 成员函数转换为所需的指针。

有人可以帮忙吗?

最佳答案

您不能将非静态成员函数指针作为普通函数指针传递。它们不是一回事,甚至可能大小也不一样。

但是,您可以(通常)通过 C 传递一个指向 static 成员函数的指针。通常在 C API 中注册回调时,您还可以传递一个“用户数据”指针,该指针获取传回您注册的函数。所以你可以这样做:

class MyClass
{

    void non_static_func(/* args */);

public:
    static void static_func(MyClass *ptr, /* other args */) {
        ptr->non_static_func(/* other args */);
    }
};

然后将你的回调注册为

c_library_function(MyClass::static_func, this);

即将实例指针传递给静态方法,并将其用作转发函数。

严格来说,为了整体可移植性,您需要使用声明为 extern "C" 的自由函数而不是静态成员来进行转发(如有必要,声明为 friend ),但实际上,使用这种方法将 C++ 代码与 GObject 代码接口(interface)我从来没有遇到过任何问题,这是 C 回调繁重的。

关于c++ - 将 C++ 函数指针转换为 c 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808054/

相关文章:

c - 从带有指针的函数返回更大类型的日期

c++ - Visual Studio 2012 C++ 代码覆盖合并可执行文件

c - 我的代码如何创建代码并在 C 中调用它?

c - 这段代码的输出是什么,因为这段代码给了我一个空白输出,这怎么可能是真的?

C 回调的 Python 包装

C 预处理器指针调配

c - 将文本文件中的数字读入动态分配的二维数组

c++ - 在 Mac OS 上使用 GCC 为 MS-DOS (DOSBox) 编译 C 程序

c++ - 如何修复此错误 : set a breakpoint in malloc_error_break to debug

c++ - LZO 压缩字符*