[英]Calling c++ object in callback function of c library
我正在使用一个使用回调函数的 C 库。
有什么方法可以调用 object 的 C++ class?
编辑:
我正在使用 c-client 库。 其中有 function mm_log。
void mm_log(char* string, long err_flag)
库在内部调用它。 我想检查它被调用的是哪个 Imap stream。
更多信息,您可以从ftp://ftp.cac.washington.edu/imap下载库
所有需要回调的(好)C 库函数都有一个void* user_data
指针作为 function 和回调参数的一部分。 您只需将指向 object 的指针传递给 function ,它就会在回调中传回给您。 例子:
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);
}
如果mm_log
是您正在实现的 function 并且库正在调用(顺便说一句,这是库进行回调的一种糟糕方式),那么您无法让它引用 function 中的 ZC61DZAB.
你可以做的是在调用库之前使用一个全局变量来指向你的 object (并在之后清除),然后在mm_log
中使用它来调用所需的方法。 这是令人讨厌和危险的,但可以工作。
如果你有多个线程,那么要格外小心——或者找一个更好的库。
代码对于这样的问题很重要。 但是没有看到你的任何代码,我仍然可以给你一个笼统的声明:)
您必须使用访问普通旧结构的全局函数来包装 C++ object,并使用以下命令导出:
extern "C"
有很多警告,但这是它的要点。
请参阅此常见问题解答: http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.