typedef structで同じシンボルをtypedefしている

[戻る]
みっちゅー 2010/11/24(水) 23:02:59
もしかするとすごい初歩的な質問かもしれません。

参考にしているヘッダ上で
typedef struct symbolA symbolA;

というように、同じシンボルをtypedefしています。
これってどういう事になるのでしょうか?

typedefでstructを省略させているのは分かりますが、そもそものsymbolAはどこでも定
義・宣言されていません。
それなのに、
symbolA * hoge;
のように使えています。

なんだか釈然としません。
symbolAは何型になっているのでしょうか・・・・?

tetrapod 2010/11/25(木) 08:55:41
これ、文法書的解釈を厳密に行おうとすると結構めんどくさい話を含んでいるのだが
そういう厳密な話がしたいの?
それとも(説明のための省略がある)簡単な話でいいの?
以下ではちょっと詳しい話をしてみよう。

typedef は話が厄介になるだけなので後に回すものとする。
なお以下 C++ に限定( C だと若干文法が違うため)

struct symbolA; とだけ書くことは文法書上認められていて「型宣言」という。
(正確には、型定義にならない型宣言という)
先行宣言とか言う場合もある。
型の先行宣言だけがある状態では、その型の変数を作ることは認められないけど
ポインタ・参照を作る、関数宣言することはできる規則になっている。
この記述ができないとリンクリストのようなものが作れない。

struct T; // 不完全型宣言
struct T* p; // OK ポインタを作ることは認められている
extern struct T t; // OK 変数 t が作られるわけではないので問題ない
struct T& r(t); // OK 参照を作ることは認められている
struct T tt; // NG 不完全型のまま変数を作ることはできない
struct T funcT(struct T); // OK 関数宣言は問題ない

これに対して struct symbolA { ... }; と書くことは「型定義」である。
(正確には、型定義を兼ねる型宣言)
型定義の後は struct symbolA という完全型ができるので変数定義ができる。

さて typedef struct T T; は、文法書上どう解釈されるかだが
・ struct T という(型定義にならない)型宣言がある
・この struct T の別名として T という名を typedef する
ということ。
typedef 名と class/struct 名が同じことは認められているので問題ない。

みっちゅー 2010/11/28(日) 12:01:27
[[解決]]
tetrapodさんありがとうございます。

勉強になりました。

古いスレッドには追加発言できません。