在c库的回调函数中调用c ++对象

时间:2011-07-01 06:11:12

标签: c++ c callback

我正在使用一个使用回调函数的C库。

有什么办法可以访问C ++类的调用对象吗?

修改

我正在使用c-client lib。 其中有mm_log函数。

 void mm_log(char* string, long err_flag)

由内部调用库。我想检查它被调用的Imap流。

更多信息 您可以从ftp://ftp.cac.washington.edu/imap

下载库

3 个答案:

答案 0 :(得分:3)

需要回调的所有(好)C库函数都有一个void* user_data指针作为函数和回调参数的一部分。您只需将指向对象的指针传递给函数,它就会在回调中传递给您。例如:

typedef void (*callback)(void*);

void dumb_api_call(callback cb, void* user_data){
  cb(user_data);
}

struct Foo{};

void my_callback(void* my_data){
  Foo* my_foo = static_cast<Foo*>(my_data);
}

int main(){
  Foo my_foo;
  dumb_api_call(my_callback, &my_foo);
}

答案 1 :(得分:1)

如果mm_log是您正在实现的函数并且库正在调用(顺便说一下,这是库执行回调的一种可怕方式),那么就没有办法让它可以引用它你班上的一个成员函数。

你可以做的是使用一个全局变量,你在调用库之前设置它指向你的对象(并在之后清除),然后在mm_log中使用它来调用所需的方法。这是令人讨厌和危险的,但可以工作。

如果您有多个主题,请谨慎行事 - 或者找一个更好的库。

答案 2 :(得分:0)

代码对于这样的问题很重要。但是,如果没有看到任何代码,我仍然可以给你一个全面的陈述:)

您必须使用访问普通旧结构的全局函数包装C ++对象,并使用以下函数导出:

extern "C"

有很多警告,但这是它的要点。

请参阅此常见问题解答:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html