ホームページ > バックエンド開発 > C++ > C で Void ポインターを関数ポインターに変換できますか?

C で Void ポインターを関数ポインターに変換できますか?

Mary-Kate Olsen
リリース: 2024-11-03 04:42:31
オリジナル
799 人が閲覧しました

Can C   Convert a Void Pointer to a Function Pointer?

Void ポインタから関数ポインタへの変換: C の条件付き可能性

問題

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

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