从C回调调用C ++方法

时间:2014-07-20 19:07:39

标签: c++ c callback

我将C库用于C ++项目。这个库允许我注册一个C回调,在这个回调中我应该调用一个对象的C ++方法。

情况如下:

myclass.h

class myclass
{
public:
    myclass();
    void callme();
};


extern "C"
{
     void init():
     int callback(int,int);
}

myclass.cpp

myclass::myclass()
{
   init();
}

void myclass::callme()
{
   cout<<"Ok\n";
}

    extern "C"
    {
       void init()
       {
          //code 

          setlibraryCallback(callback);

          //code
       }


       int callback(/*some arguments that I can't change*/ int a, int b)
       {
          //I should call  "callme()" methos of my c++ object
       }
    }

我可以从这个C回调中调用C ++方法吗?如果是,我该怎么办? 感谢

编辑: 我发现了类似的问题 How to call a C++ method from C? 但是我无法将该对象作为无效指针传递给C回调,因为我无法更改回调参数。

1 个答案:

答案 0 :(得分:3)

库通常允许您提供void *值作为“上下文”,然后将其传递给回调。如果库没有提供该功能(呵呵?),你可以使用线程局部变量(在单线程程序中也称为全局变量)。

这就是代码通常的样子。

class A {
public:
    static void static_callback(void * ctx) {
        static_cast<A*>(ctx)->callback();
    }
    void callback();
};

extern void library_function(void (*callback)(void *), void * ctx);

int main()
{
    A a;
    library_function(&A::static_callback, &a);
}