C で void ポインターを関数ポインターにキャストできますか?

Barbara Streisand
リリース: 2024-11-02 21:20:30
オリジナル
450 人が閲覧しました

Can You Cast void Pointers to Function Pointers in C  ?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート