我正在使用 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/