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

In article <3989208news.pl@insigna.ie.u-ryukyu.ac.jp>
        kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> cast よりはtypedefが分かりやすいですよね。
>     typedef int function();
> の方が、
>     (int ())function
> よりは自然なわけだから...

関数のポインタが入ってしまうと、typedef は必須でしょう。
typedef なしでは、人の知恵を越えてしまいます。

> > 例外とは、鋭いですね。C言語の当初の設計には、typedef がなく
> > て、困っていて、後から泥縄式に付け足したという歴史があります。
> たしかに、ちょっとださいかも。ポインタが無ければいらないとい
> う気もするし。実際、Java とかには無くても困らないわけだし。

構造体で、s.x と s->x の違いが書けなくなるんだけど、困る人は
今や小数派という話はあるんでしょう。

In article <3989209news.pl@insigna.ie.u-ryukyu.ac.jp>
        kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> つうか〜  
>      int a;
>      int *f();
>      char *c[];
> とかが、a とかf とか c という名前のの実体と型を定義しているわけですけど、

Cの難しい所は、名前にたいして修飾語が前にも後にも置けるとい
うことです。前に置くのは、「*」。後ろに置くのは、「[]」とか
「()」。Pascal は後ろにしか置けないから紛れはないけれど、C
は前にも後ろにもおけて、どちらの結合が強いかかわらなくなるわ
けです。たとえば、下の3つのうち、2つは同じなんですけど、ど
れだかわかりますか。

     int *f();
     int (*f)();
     int *(f());

関数の括弧と結合どの括弧が混じっているので、さらにめちゃめちゃ
なんだけど。次の方がまだ優しいかな。

     char *c[];
     char (*c)[];
     char *(c[]);

>          (int (*)())(*)()
> なんて、何がなんだかわからんものも書けるし...
>          typedef int (*fnptr)();
>          typedef fnptr (*fnptr_fn)();
> だったら、まだ、なんか許せるっつうか...

1個だけなら、まだ、一度変宣言したフリをして、変数の名前を消
せばいいけど、2個になると駄目です。たとえば、int (*fnptr)() 
に全体に括弧をつけて、名前を消すと(int (*)())となります。

> > 具体的な、このtypedefの用例なんかも知りたいのですが、
> > 文献等あれば教えていただけませんでしょうか。
> 
> やっぱり規格書なんじゃないかなぁ。 僕は、K&R の後は、
> いろんなソースを読んで勉強しました。

Cの規格書って、まともなものはあるんですか。規格書が長い間な
くて、「K&Rの例題が全部通る」みたいな記述もありました。
Unix の Portable C compiler のフロントエンドをそのまま使えば
その点では互換性の問題はなくてそんなに困らなかったという話も
あるし。

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