ただいま構造体について勉強しています。
その最中に少し疑問が出ました。通常、構造体を宣言するには
こんなかんじですが、typedefを使って
ともできる。ということを知りました。
なぜtypedefの時はstructの後に構造体タグを付けなくてもいいのですか?
構造体とtypedefについて
Re: 構造体とtypedefについて
つけなくても、その構造体のインスタンスを作成することができるから?
まあ違いは、前者はstructつけないとだめですが、後者はつけなくても(いやむしろつけない)okですね。typedefによって決まっているので。 どちらをとるかお好みで。ただWindows APIのヘッダとかみると、両方ともありますけどね。以下のように。この場合、変数を宣言するときは以下のような感じになりますね。
まあ違いは、前者はstructつけないとだめですが、後者はつけなくても(いやむしろつけない)okですね。typedefによって決まっているので。 どちらをとるかお好みで。ただWindows APIのヘッダとかみると、両方ともありますけどね。以下のように。
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;written by へにっくす
-
Lawliet
Re: 構造体とtypedefについて
ソース上では無名タグでも、コンパイル時に適当な文字列をタグ名にしていると思います。Lawliet さんが書きました:「システム側がどちらのオブジェクトを作ればいいのかわからずエラーを出したりしないのでしょうか?
もしエラーが出ないのであればそれはなぜでしょうか?」
そもそもtypedefで宣言したらintやcharと同じように型名として扱われるんだから、その型名と結びつければ問題ないのは自明かなと思うのですが、それだけでは納得できませんか?
written by へにっくす
-
Lawliet
Re: 構造体とtypedefについて
これで納得出来ました。ありがとうございます。ソース上では無名タグでも、コンパイル時に適当な文字列をタグ名にしていると思います。
変数などを宣言するときにはちゃんと名前を与えないとエラーになるのに
なんでこれはエラーにならないのかな?なんてずっと考えていたんですが・・・
そいうことだったんですね。
Re: 構造体とtypedefについて
正しくないところもあるかもですが…
struct { ... };
だけで型を表現(「宣言」かな)できるので,例えば,
struct { int a; int b; } InstanceName;
とか書いて,「int型変数aとbをメンバに持つ(無名)構造体な型のインスタンス」InstanceName を定義したりもできるはず.
でも,この構造体の型を示す名前がないと非常に不便なので普通はタグ名を明示的につける.
付けなかった場合(無名)は,コンパイラが勝手にタグ名を付ける…んだと思います.
typedefの話は,Cだと
struct SA{ ... };
と宣言した構造体は使う箇所でも struct を付けて
void f( struct SA * );
みたく書かないとダメでめんどくさいので→単にSAとだけ書けるように
typedef struct SA SA; //型名 struct SA を SA と書けるようにtypedef
とするんじゃないでしょうか.
で,このtypedefをstruct SAの宣言と同時にやると
typedef struct SA{ ... } SA;
という書き方になる,と.
「まぁどうせ SA とだけ書けるんだからもはや元の構造体の名前を明示的に指定しなくてもよくね?」という思想(?)の元で
typedef struct { ... } SA;
なる書き方をしてもよいと思いますが,
無名構造体は前方宣言ができなくなるので,私はわざわざ無名にしないですね.
struct { ... };
だけで型を表現(「宣言」かな)できるので,例えば,
struct { int a; int b; } InstanceName;
とか書いて,「int型変数aとbをメンバに持つ(無名)構造体な型のインスタンス」InstanceName を定義したりもできるはず.
でも,この構造体の型を示す名前がないと非常に不便なので普通はタグ名を明示的につける.
付けなかった場合(無名)は,コンパイラが勝手にタグ名を付ける…んだと思います.
typedefの話は,Cだと
struct SA{ ... };
と宣言した構造体は使う箇所でも struct を付けて
void f( struct SA * );
みたく書かないとダメでめんどくさいので→単にSAとだけ書けるように
typedef struct SA SA; //型名 struct SA を SA と書けるようにtypedef
とするんじゃないでしょうか.
で,このtypedefをstruct SAの宣言と同時にやると
typedef struct SA{ ... } SA;
という書き方になる,と.
「まぁどうせ SA とだけ書けるんだからもはや元の構造体の名前を明示的に指定しなくてもよくね?」という思想(?)の元で
typedef struct { ... } SA;
なる書き方をしてもよいと思いますが,
無名構造体は前方宣言ができなくなるので,私はわざわざ無名にしないですね.