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

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

Susan Sarandon
リリース: 2024-11-05 00:43:02
オリジナル
651 人が閲覧しました

How to Safely Cast a Void Pointer to a Function Pointer in C  ?

C での関数ポインターのキャスト

質問:

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

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