使用 C 類成員函數作為 C 回呼函數
當從 C 程式碼與 C 函式庫互動時,有必要建立回調。本文探討了嘗試將 C 類成員函數註冊為具有特定簽名 int a(int , int ) 的 C 函數的回調時遇到的挑戰。
主要障礙遇到的問題是非靜態成員函數具有類別 A* 類型的隱式第一個參數,表示 this 指標。預期的回呼函數和提供的 C 類成員函數之間的參數簽章不符會導致編譯錯誤。
解:
要克服此問題,成員函數必須宣告為靜態。這消除了隱式第一個參數,允許將 C 類成員函數註冊為回呼。
替代方法:
如果回調註冊機制允許,可以使用替代方法方法是建立一個包裝函數。此包裝函數可以是常規 C 函數,它將參數轉送到所需的 C 類成員函數。透過將包裝函數註冊為回調,可以透過代理間接呼叫類別成員函數。
範例:
請考慮下面的範例程式碼:
class A { public: A(); ~A(); int e(int *k, int *j); private: static int e_c(int *k, int *j) { A* this_ptr = reinterpret_cast<A*>(callback_user_data); return this_ptr->e(k, j); } }; A::A() { register_with_library(e_c) }
在上面的程式碼中,e_c()函數是一個靜態包裝函數,它轉換callback_user_data A* 指標的參數,允許存取this 指標並隨後呼叫e() 成員函數。這種方法使得 C 類成員函數能夠間接註冊為回調,即使它與回調函數的確切簽章不符。
以上是如何使用 C 類別成員函數作為 C 回呼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!