[英]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.