Re: typedefと関数ポインタ
新城@筑波大学情報です。こんにちは。
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];
> などの記述についても説明されているものをあまり見かけません。
ホント、分かりにくい所です。つまり、解説書を書く人も実はよく
わかっていないか、説明すると面倒なので書いていないとか、そう
いう事情はあると思います。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735