多くの場合、C フレームワークは関数ポインターを使用して機能を拡張し、リスナーに通知します (win32-api や GLUT など)。オブジェクト指向の C++ をプログラミングする場合、これを処理するためにクラスとオブジェクトを使用することを好みます。だから私の質問は:
Cライブラリが関数ポインタを期待している静的メソッドへのポインタを使用するのは安全ですか?
正式にはできませんが、実際にはできます。C コードから呼び出し可能にするには、C++ 関数を マークextern "C"
して、C コンパイラが期待する呼び出し規約を確実に使用する必要があります。静的メンバー関数を としてマークする方法がないextern "C"
ため、C コードから正常に呼び出すことができることを保証する方法はありません。Cコードと同じ呼び出し規則を静的メンバー関数に使用しないコンパイラを知らないので、これは機能します。一部のコンパイラは、技術的には関数の型が間違っているため、この状況に対して警告を生成します。実際、C++ 標準を見ると、コールバックを受け取る C 関数 (qsort
たとえば、) には 2 つのバージョンがあります。1 つは関数を受け取るバージョンextern "C"
、もう1 つは関数を受け取るバージョンextern "C++"
です。