|
|
|
1-4-4. 複雑な型宣言を解釈する1つの方法C言語は型宣言が複雑な時は、いったい何を表現しているのか迷うことが良くあります。例えば以下の宣言はどうゆう意味になるのでしょうか。char (*x())[];xは関数です。そしてその関数は文字の配列へのポインタを返します。構文に十分に慣れた人ならこれだけで解釈することができるでしょう。しかし中級者でもさっと意味を悟る訳にはいきません。もっと複雑になったらどうしましょう。C言語は優先順位が決められています。それを逆にたどったらどうでしょう。例えば上記の例ならこうします。 char (*x())[]
(*x())[] : char : 文字
*x() : array of char : 文字の配列
x() : pointer to array of char : 文字の配列へのポインタ
x : proc pointer to array of char : 文字の配列へのポインタ
を返す関数
つまり以下の様に解釈します。
* pointer to 〜へのポインタ [] array of 〜の配列 () proc 〜を返す関数いくつか考えてみましょう。 int *x()
*x() : int : 整数
x() : pointer to int : 整数へのポインタ
x : proc pointer to int : 整数へのポインタを返す関数
int (*x)()
(*x)() : int : 整数
*x : proc int : 整数を返す関数
x : pointer to proc int : 整数を返す関数へのポインタ
int (*x[])()
(*x[])() : int : 整数
*x[] : proc int : 整数を返す関数
x[] : pointer to proc int : 整数を返す関数へのポインタ
x[] : array of pointer to proc int : 整数を返す関数への
ポインタの配列
int x[]()
x[]() : int : 整数
x[] : proc int : 整数を返す関数
x : array of proc int : 整数を返す関数の配列
関数のポインタの配列はありますが、関数の配列はないためこの構文はエラーです。
どんなに複雑な宣言もこの様にして分解すれば、意味をつかむこともできます。またさらにこれを逆にたどれば、思いどうりに型を宣言をすることもできます。
|