首頁 >後端開發 >C++ >如何使用 C 類別成員函數作為 C 回呼?

如何使用 C 類別成員函數作為 C 回呼?

Patricia Arquette
Patricia Arquette原創
2024-12-20 20:36:12771瀏覽

How Can I Use a C   Class Member Function as a C Callback?

使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn