Re: typedef と関数ポインタ
河野真治 @ 琉球大学情報工学です。
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,
河野真治 @ 琉球大学工学部情報工学科,
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