質問:
dlsym() によって返された void ポインターがあります。この void ポインタが指す関数を呼び出す必要があります。 static_cast と reinterpret_cast の両方を使用してキャストを試みましたが、どちらも機能しませんでした。どのようなオプションがありますか?
答え:
void ポインターを関数ポインターに直接変換することは、C 98/03 では禁止されています。 C 0x では条件付きでサポートされている可能性がありますが、その動作は実装定義です。
非標準ソリューション:
標準のあいまいさにもかかわらず、いくつかの非標準ソリューションがあります。未定義とみなされますが、ほとんどのプラットフォームで動作する可能性のある標準ソリューション動作:
オプション 1:
<code class="cpp">typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
オプション 2:
<code class="cpp">fptr my_fptr = 0; reinterpret_cast<void*&>(my_fptr) = gptr;</code>
オプション 3 (遅いMotion):
<code class="cpp">void (**object_ptr)() = &my_ptr; void **ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
これらのオプションは、関数ポインターのアドレスがオブジェクト ポインターであるという事実を利用し、reinterpret_cast を使用した間接キャストを可能にします。
注:
これらのソリューションは、すべてのプラットフォームで動作することが保証されているわけではなく、標準 C とはみなされません。ご自身の責任で使用してください。
以上がC で Void ポインターを関数ポインターに安全にキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。