4

たとえば、次の (抽象) 宣言を見てください。

int (*) (*)

// int を返し、引数を取らない関数へのポインタ

(次のサイトから取得しました: http://www.vineetgupta.com/blog/deciphering-complex-c-declarations )

void だけが引数なしを意味すると思いました。これは本当に と同じことを意味しますか :

int (*) (void)

もしそうなら、引数を指定しないために * を使用できるとどこに記載されていますか?

また、このような抽象宣言は型キャストに対してのみ存在すると仮定して正しいでしょうか? もしそうなら、それは現在の形式では無効であるに違いありません。だからint(*)(void)無効ですが(int(*)(void))、有効ですよね?

4

2 に答える 2

13

int を返し、引数を取らない関数へのポインタ

そうではありません。関数は引数としてポインターを取りますが、型指定子がないため、ポインターの基本型は と見なされますint。これは古い (標準化前の) 動作であり、許可するコンパイラもあれば、許可しないコンパイラもあります。

void だけが引数なしを意味すると思いました。これは本当に と同じことを意味しますか :

int (*) (void)

いいえ、そうではありません。上で説明した理由からです。

また、このような抽象宣言は型キャストに対してのみ存在すると仮定して正しいでしょうか?

いいえ、関数宣言の関数引数リストでも使用できます。そう、

int factorial(int);

まったく問題ありません

void qsort(void *, size_t, size_t, int (*)(const void *, const void *));
于 2013-07-20T07:45:38.277 に答える