C で Void ポインタを関数ポインタにキャストする
dlsym() などの関数から返される void ポインタを関数ポインタに変換することは、C では簡単ではありません。デフォルトでは、このような直接キャストは C 98/03 で禁止されています。
制限の理由
C 98/03 では、void* ポインタはオブジェクトを参照することを目的としていました。関数またはメンバー ポインターではありません。
C 0x での条件付きサポート
C 0x では、関数ポインターへの void* のキャストが実装によってオプションでサポートされます。サポートされている場合、動作は標準に準拠する必要があります。
実装依存の回避策
直接キャストは許可されていませんが、次の回避策はほとんどのプラットフォームで機能する可能性があります。
<code class="cpp">fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
これらの回避策は、関数ポインタのアドレスがオブジェクトであり、reinterpret_cast を使用して void** ポインタに変換できるという事実を利用します。
注意事項
これらの回避策には未定義の動作が含まれます慎重に使用する必要があります。
以上がC で void ポインターを関数ポインターにキャストできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。