ホームページ >バックエンド開発 >C++ >C で `void*` を関数ポインタに安全にキャストするにはどうすればよいですか?

C で `void*` を関数ポインタに安全にキャストするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-03 01:36:02497ブラウズ

How Can I Safely Cast a `void*` to a Function Pointer in C  ?

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 標準によって保証されていません。
  • 一部のプラットフォームまたは特定のコンパイラでは、未定義の動作が発生する可能性があります。
  • ポインタを使用する前に、常にポインタの有効性を確認することをお勧めします。

注:

C 0x では、void* を関数ポインターに変換する動作が条件付きでサポートされています。

以上がC で `void*` を関数ポインタに安全にキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。