「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ は Void ポインターを関数ポインターに変換できますか?

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

2024 年 11 月 12 日に公開
ブラウズ:677

Can C   Convert a Void Pointer to a Function Pointer?

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

問題

dlsym() 経由で void ポインタを取得する、目的は次のとおりです。そのポインタによって参照される関数を呼び出します。 C スタイルのキャストとは異なり、static_cast または reinterpret_cast を使用したキャストによる変換の試みは失敗しました。

Answer

void ポインターから関数ポインターへの直接変換は、C 98/03 では許可されません。ただし、C 0x は条件付きサポートを提供し、実装で動作を決定できるようにします。

未定義の動作アプローチ:

標準では定義されていませんが、次のコードは動作する可能性があります。ほとんどのプラットフォーム:

void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));

代わりに:

fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;

複雑だが移植可能なアプローチ:

このメソッドは、関数ポインターのアドレスがオブジェクト ポインターであるという事実を利用します。

// Get address as object pointer
void (**object_ptr)() = &my_ptr;

// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);

// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;

このアプローチは標準では未定義のままですが、ほとんどの実装で十分に機能するはずです。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3