我正在使用一个使用回调函数的C库。
有什么办法可以访问C ++类的调用对象吗?
修改
我正在使用c-client lib。 其中有mm_log函数。
void mm_log(char* string, long err_flag)
由内部调用库。我想检查它被调用的Imap流。
更多信息 您可以从ftp://ftp.cac.washington.edu/imap
下载库答案 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