C クラス メンバー関数を C コールバック関数として使用する
C コードから C ライブラリと対話する場合、コールバックを確立する必要があります。 。この記事では、C クラスのメンバー関数を、特定のシグネチャ int a(int , int ) を持つ C 関数のコールバックとして登録しようとするときに遭遇する課題について説明します。
主な障害非静的メンバー関数が、 this ポインターを表すクラス A* 型の暗黙の最初のパラメーターを所有していることがわかります。予期されるコールバック関数と提供された 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* ポインターに追加すると、このポインターへのアクセスとその後の e() メンバー関数の呼び出しが可能になります。このアプローチにより、コールバック関数の正確な署名と一致しない場合でも、C クラスのメンバー関数をコールバックとして間接的に登録できます。
以上がC クラスのメンバー関数を C コールバックとして使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。