構造体とtypedefについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Lawliet

構造体とtypedefについて

#1

投稿記事 by Lawliet » 12年前

ただいま構造体について勉強しています。
その最中に少し疑問が出ました。通常、構造体を宣言するには

コード:

struct hoge{
int x;
int y;
};
こんなかんじですが、typedefを使って

コード:

typedef struct{
int x;
int y;
} hoge;
ともできる。ということを知りました。

なぜtypedefの時はstructの後に構造体タグを付けなくてもいいのですか?

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 構造体とtypedefについて

#2

投稿記事 by へにっくす » 12年前

つけなくても、その構造体のインスタンスを作成することができるから?
まあ違いは、前者は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;
written by へにっくす

Lawliet

Re: 構造体とtypedefについて

#3

投稿記事 by Lawliet » 12年前

すいません。僕が言いたいのはこういうことです。

例えばこう宣言したとします

コード:

typedef struct{
int x;
int y;
} hoge;

typedef struct{
int class;
int number;
}student;
この時に、hogeのオブジェクトを宣言した時にhoge、student共に構造体タグがないので
「システム側がどちらのオブジェクトを作ればいいのかわからずエラーを出したりしないのでしょうか?
 もしエラーが出ないのであればそれはなぜでしょうか?」
ということです。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 構造体とtypedefについて

#4

投稿記事 by へにっくす » 12年前

Lawliet さんが書きました:「システム側がどちらのオブジェクトを作ればいいのかわからずエラーを出したりしないのでしょうか?
 もしエラーが出ないのであればそれはなぜでしょうか?」
ソース上では無名タグでも、コンパイル時に適当な文字列をタグ名にしていると思います。
そもそもtypedefで宣言したらintやcharと同じように型名として扱われるんだから、その型名と結びつければ問題ないのは自明かなと思うのですが、それだけでは納得できませんか?
written by へにっくす

Lawliet

Re: 構造体とtypedefについて

#5

投稿記事 by Lawliet » 12年前

ソース上では無名タグでも、コンパイル時に適当な文字列をタグ名にしていると思います。
これで納得出来ました。ありがとうございます。

変数などを宣言するときにはちゃんと名前を与えないとエラーになるのに
なんでこれはエラーにならないのかな?なんてずっと考えていたんですが・・・
そいうことだったんですね。

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: 構造体とtypedefについて

#6

投稿記事 by usao » 12年前

正しくないところもあるかもですが…

 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;
なる書き方をしてもよいと思いますが,
無名構造体は前方宣言ができなくなるので,私はわざわざ無名にしないですね.

閉鎖

“C言語何でも質問掲示板” へ戻る