1

関数シンボルをロードするために dlsym() を使用していました

void (*func)(int);
func = (func*)dlsym(phandle, "function");

これにより、コンパイルエラーが発生しました。ただし、typedefを機能させると

 typedef void (*func)(int);
 func function = null;
 function = (func*)dlsym(phandle, "function");

これはうまくコンパイルされましたが、最初のケースでなぜ失敗したのか理解できませんか? 誰か理由を教えてください。C++ 標準では、void* から関数ポインターへの直接キャストが許可されていないことを読みましたか? これはなぜですか? typedef はこの問題をどのように解決しましたか?

4

2 に答える 2

5

func型ではなく変数であり、キャストで使用できないため、最初のケースでは失敗します。

*が間違っていることに注意してください。

typedef void (*func)(int);
           /* ^ must be here. */
于 2013-03-21T10:40:17.467 に答える
3

void *一部のプラットフォームでは実装が難しいため、関数ポインタと関数ポインタの間のキャストは禁止されています。

コードとデータが物理的に異なるメモリに存在するコンピュータ (ハーバード アーキテクチャを参照) があります。したがって、何らかのデータへのポインターがあるからといって、それを魔法のようにコードへのポインターに変換しても意味がありません。

void *そのため、および 関数への/からのキャストは許可されていません。確かに、ほとんどの最新/典型的な CPU (つまり、ハーバードではなく、フォン ノイマン アーキテクチャを使用するマシンを意味します) では、キャストは機能します

于 2013-03-21T10:42:54.923 に答える