• ベストアンサー

C キャスト方法を教えてください

C言語の初心者なのですが、 int abc(int(*read)(void*, int, int), int size, char* data); ような関数で第1引数の値をキャストするときどうすればよいですか。   int read = (????)NULL; そもそもint(*read)(void*, int, int)ってどういう意味ですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.2

int(*read)(void*, int, int) は、引数に"void*, int, int"を持ち、int を返す関数ポインタです。 read の型は、処理系に依存し、VC++ 6 では、"__cdecl *" が default type です。 (変数も定義しないと、int になるのと同じ) キャストの仕方は、次ぎの例の通り。 int main(...){ void *p; int a, b, retValue; .... /* p, a, b は値が入っているとして */ retValue = abc((int (__cdecl *)(void *, int, int))p, a, b); .... } これでは、移植性が悪いので、read の型は自分で定義します。 typedef int (*READP)(void *, int, int); とすると、先の呼び出しは、 retValue = abc((READP)p, a, b); となります。 (処理系に合わせて呼び出しシーケンスを厳密に定義するため typedef int (WINAPI *READP)(.... とすることもあります。 この辺はくわしくありませんので、どなたかに)

その他の回答 (2)

  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.3

ごめん。 #2 で、b の定義が間違っていた。 char *b; だ。

  • pacifist
  • ベストアンサー率40% (4/10)
回答No.1

「 そもそもint(*read)(void*, int, int) 」 とは例えば、 int sample(void* pvA, int nB, int nC) { ... } の様に定義された関数をさします。このような関数を定義して nR = abc(sample, size, data); のように関数を呼び出します。

関連するQ&A