新城@筑波大学情報です。こんにちは。

In article <20031122173333.F99C.INGRAM@os.rim.or.jp>
        Hyu-ga Hiroya <ingram@os.rim.or.jp> writes:
> こんにちは。お世話になります。
> int (*fp)(int);
> と記述すると
> intを1つ引数にもち、intを返す関数のポインタ変数fpを
> 宣言することになりますが、
> typedef int (*fp)(int);
> と記述すると、
> intを1つ引数にもち、intを返す関数のポインタ型名「fp」
> を作成することになります。

はい。C言語を使っている人でも、なかなか気が付かない所ですよ
ね。ひゅうがさんの記事をみて、ああそういうことだったのかと思っ
た人もたくさんあると思います。私も typedef の話をする時には、
「まず変数宣言をするふりをして、頭に typedef を付けると型に
なる」と説明しています。

> このtypedefの使用例は構文例外なのでしょうか。

例外とは、鋭いですね。C言語の当初の設計には、typedef がなく
て、困っていて、後から泥縄式に付け足したという歴史があります。

> K&Rではtypedefは記憶クラス指定子扱いであるとは
> 書いてありますが、ここらへんを詳しく説明している
> 文献などありましたら教えていただけないでしょうか。

typedef は、明らかに記憶クラス指定子(staticとかautoとか
registerとか)ではないです。ただ、コンパイラを作る時の都合上、
何か入れないといけないと思ってどうしようかと考えて、「構文上
は記憶クラス指定子入れてしまえ」と入れちゃったんだと思います。
一種の手抜きとも言えますが、他に入れる余地も少なかったのでしょう。

> また解説書などでは、
> typedef int int_array3[3];
> などの記述についても説明されているものをあまり見かけません。

ホント、分かりにくい所です。つまり、解説書を書く人も実はよく
わかっていないか、説明すると面倒なので書いていないとか、そう
いう事情はあると思います。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\