C での関数ポインターのキャスト
C では、一般に void* を関数ポインターに直接変換することは許可されません。ただし、実装とプラットフォームに応じて機能するアプローチがいくつかあります。
メソッド 1 (未定義の動作):
このメソッドには、二重の reinterpret_casting:
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
方法 2 (直接変換を回避):
このメソッドは、中間ステップを使用して関数ポインター アドレスを変数に格納します:<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
方法 2 の速度は遅いがより透過的なバージョン:
<code class="cpp">void (**object_ptr)() = &my_ptr; void ** ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
制限事項と注意事項:
注:
C 0x では、void* を関数ポインターに変換する動作が条件付きでサポートされています。以上がC で `void*` を関数ポインタに安全にキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。