河野真治 @ 琉球大学情報工学です。

In article <20031124214443.8F52.INGRAM@os.rim.or.jp>, Hyu-ga Hiroya <ingram@os.rim.or.jp> writes
> 普通のポインタと同じような「変数」的なイメージではなく、
> 関数のスタート位置(アドレス)の変更が可能な関数プロトタイプ宣言の
> イメージである。

つうか〜  

     int a;
     int *f();
     char *c[];

とかが、a とかf とか c という名前のの実体と型を定義しているわけですけど、
それに、typedef をつけると...

     typedef int a;
     typedef int *f();
     typedef char *array[];

見た目そのまんま、対応する名前に型が結びつけられるわけですよね。

なんとなく、

> typedefの使い方としては、
> typedef 型名 新型名;
> というのがまず基本にあると思います。

って考えたくなるけど、違うんだよね。

     typedef 定義式

ですよね。コンパイラの実装を考えると、

     typedef が出て来たら、mode を tyedef にして、
     そのまま、普通に構文解析して、
     identifier が来たら、変数とかを定義するかわりに、
     今の型を、その名前に定義する

ってわけで、簡単なんですよね。実際、同じ構文解析プログラム使えるし。
ストレージクラスじゃないとかいってた人もいるけど、実装的には、
ストレージクラスと同じ部分に実装します。

だから、
      typedef struct hoge {...} hoge,*hogeptr;
とかの並列のtypedefも、
      typedef 型 hoge,*hogeptr;
ってよりは、
      struct hoge {...} hoge,*hogeptr;
と同じ名前の定義式なんだよな。

> typedef int()(int) *fp;
> 見たいな感じで記述したい気持ちでした。(ちょっと無理やりですが。)

この C のidentifier抜きの型名ってすごくわかりずらいですよね。
なので、それを解決するために typedef を導入したのだと思います。

         (int (*)())(*)()

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

> 具体的な、このtypedefの用例なんかも知りたいのですが、
> 文献等あれば教えていただけませんでしょうか。

やっぱり規格書なんじゃないかなぁ。 僕は、K&R の後は、
いろんなソースを読んで勉強しました。

---
Shinji KONO @ Information Engineering, University of the Ryukyus, 
河野真治 @ 琉球大学工学部情報工学科,