【问题标题】:call a C++ method from a C callback从 C 回调调用 C++ 方法
【发布时间】:2014-07-20 19:07:39
【问题描述】:

我正在将 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? 但是我不能将对象作为 void 指针传递给 C 回调,因为我无法更改回调参数。

【问题讨论】:

  • 您需要在帖子中包含一个实际问题。就目前而言,我们不知道您需要和/或想要什么。
  • "我可以从这个 C 回调中调用 C++ 方法吗?" ——你尝试的时候发生了什么? “如果是,我该怎么办?” -- 什么,你不知道怎么调用函数?
  • 我无法调用“callme()”函数,因为外部代码不在类中,如果我尝试调用 callme(),则会出错。
  • 那么为什么不获取 C++ 类的实例并从该对象调用 callme 呢?您在源代码中的 cmets 暗示使用了一个 object,但您并没有引用一个。
  • 您可以使用singleton,但这意味着只能有一个myclass 实例获得回调。

标签: c++ c callback


【解决方案1】:

库通常允许您提供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);
}

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 2011-05-26
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多