dlsym() 経由で void ポインタを取得する、目的は次のとおりです。そのポインタによって参照される関数を呼び出します。 C スタイルのキャストとは異なり、static_cast または reinterpret_cast を使用したキャストによる変換の試行は失敗しました。
C 98/03 では、void ポインターから関数ポインターへの直接変換は許可されません。ただし、C 0x は条件付きサポートを提供し、実装で動作を指定できるようにします。
未定義の動作アプローチ:
標準では未定義ですが、次のコードは動作する可能性があります。ほとんどのプラットフォーム:
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); 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>
複雑だが移植可能なアプローチ:
このメソッドは、関数ポインターのアドレスがはオブジェクト ポインタです:
<code class="cpp">// Get address as object pointer void (**object_ptr)() = &my_ptr; // Convert to void** (also an object pointer) void **ppv = reinterpret_cast<void**>(object_ptr); // Store address from 'gptr' in memory cell pointed to by 'ppv' *ppv = gptr;</code>
このアプローチは標準では未定義のままですが、ほとんどの実装で十分に機能するはずです。
以上がC で Void ポインターを関数ポインターに変換できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。