ページ 1 / 1
構造体とtypedefについて
Posted: 2013年6月23日(日) 22:26
by Lawliet
ただいま構造体について勉強しています。
その最中に少し疑問が出ました。通常、構造体を宣言するには
コード:
struct hoge{
int x;
int y;
};
こんなかんじですが、typedefを使って
コード:
typedef struct{
int x;
int y;
} hoge;
ともできる。ということを知りました。
なぜtypedefの時はstructの後に構造体タグを付けなくてもいいのですか?
Re: 構造体とtypedefについて
Posted: 2013年6月23日(日) 22:37
by へにっくす
つけなくても、その構造体のインスタンスを作成することができるから?
まあ違いは、前者はstructつけないとだめですが、後者はつけなくても(いやむしろつけない)okですね。typedefによって決まっているので。
コード:
struct hoge _hoge = {0, 0};
コード:
hoge _hoge = {0, 0};
どちらをとるかお好みで。ただWindows APIのヘッダとかみると、両方ともありますけどね。以下のように。
コード:
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
この場合、変数を宣言するときは以下のような感じになりますね。
コード:
struct _PROCESS_INFORMATION pi1 = {0};
PROCESS_INFORMATION pi2 = {0};
PPROCESS_INFORMATION ppi = &pi1;
LPPROCESS_INFORMATION ppi = &pi2;
Re: 構造体とtypedefについて
Posted: 2013年6月23日(日) 22:46
by Lawliet
すいません。僕が言いたいのはこういうことです。
例えばこう宣言したとします
コード:
typedef struct{
int x;
int y;
} hoge;
typedef struct{
int class;
int number;
}student;
この時に、hogeのオブジェクトを宣言した時にhoge、student共に構造体タグがないので
「システム側がどちらのオブジェクトを作ればいいのかわからずエラーを出したりしないのでしょうか?
もしエラーが出ないのであればそれはなぜでしょうか?」
ということです。
Re: 構造体とtypedefについて
Posted: 2013年6月23日(日) 22:53
by へにっくす
Lawliet さんが書きました:「システム側がどちらのオブジェクトを作ればいいのかわからずエラーを出したりしないのでしょうか?
もしエラーが出ないのであればそれはなぜでしょうか?」
ソース上では無名タグでも、コンパイル時に適当な文字列をタグ名にしていると思います。
そもそもtypedefで宣言したらintやcharと同じように型名として扱われるんだから、その型名と結びつければ問題ないのは自明かなと思うのですが、それだけでは納得できませんか?
Re: 構造体とtypedefについて
Posted: 2013年6月23日(日) 23:01
by Lawliet
ソース上では無名タグでも、コンパイル時に適当な文字列をタグ名にしていると思います。
これで納得出来ました。ありがとうございます。
変数などを宣言するときにはちゃんと名前を与えないとエラーになるのに
なんでこれはエラーにならないのかな?なんてずっと考えていたんですが・・・
そいうことだったんですね。
Re: 構造体とtypedefについて
Posted: 2013年6月24日(月) 13:23
by usao
正しくないところもあるかもですが…
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;
なる書き方をしてもよいと思いますが,
無名構造体は前方宣言ができなくなるので,私はわざわざ無名にしないですね.