簡體   English   中英

在 Z4A8A08F09D37B73795649038408B5F3 的回調 function 中調用 c++ object

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM