C API コールバック用の C の静的メンバー関数ポインター: 安全で移植可能な方法ですか?
呼び出し規約は明らかに類似していますが、 、C API のコールバックとして静的メンバー関数ポインターを使用することは、C 標準によれば安全または移植可能とはみなされません。
C 言語のバインディングとリンケージ
セクション 3.5 C 標準では、オブジェクトまたは関数は、それらを参照するすべての宣言にわたって同一の型を持つ必要があると規定されています。これには、言語間の相互運用性の規則を決定するリンケージが含まれます。
リンケージ仕様は、非 C 宣言へのリンケージを実現するために使用されますが、C API コールバックを処理する場合、C プログラム内のコールバック ターゲットはコールバックを作成するコードと同じ言語リンケージを使用する必要があります。
C API コールバックの Extern "C"
C 標準のセクション 7.5 では、関数の型が次であることを明確にしています。異なる言語のリンケージは別個のタイプとみなされます。したがって、コールバック コードが C 言語バインディングを使用する場合、C のコールバック ターゲットも extern "C" として宣言する必要があります。
潜在的な問題
関連するコメントスタック オーバーフローの質問では、特定のプラットフォームで C API コールバックに静的メンバー関数ポインターを使用する場合の潜在的な問題が強調されています。
推奨事項
安全性と移植性を確保するには、次のように使用することをお勧めします。 extern "C" は、静的メンバー関数ポインターを直接使用するのではなく、関数を C ABI コールバックとしてラップしました。
以上がここでは、質問形式を目指し、C API コールバックに使用される C 静的メンバー関数ポインターの中核テーマに焦点を当てた、記事のタイトル オプションをいくつか示します。 * **静的メンバーを使用していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。