• ベストアンサー

構造体のtypedef宣言

下の二種類の宣言は、同じ意味でしょうか? 同じ意味だとしたら、なぜこのような2通りの記述方法があるのでしょうか? typedef struct _TIME{ int hour; int min; } TIME; typedef struct { int hour; int min; } TIME;

質問者が選んだベストアンサー

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.4

タグ付の構造体宣言ができないと自分自身へのポインタをメンバーに持つ構造体が宣言できません。 typedef struct _TIME{ struct _TIME *next; int hour; int min; } TIME;

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

同じ意味ではありません。 まず、前者で使用されている_TIMEというのは、予約済み識別子ですので、このような名前を使用した場合の動作は未定義になります(何が起きるかわかりません)。 それに対して後者は合法です。 予約済み識別子の問題をクリアした場合、または、その構造体指定子が処理系が提供するライブラリによるものである場合、既に出ている回答のとおりです。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

同じ意味ではありません。前者は_TIMEとTIMEを定義しますが、後者はTIMEだけを定義します。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

typedef宣言とstruct宣言を一緒に考えるとややこしいので、わけて考えましょう。 typedefは記憶クラス宣言。 structは型宣言。 ややこしいのは、structの方で、typedefは単純です。 structの基本文法は struct タグ名 { メンバ宣言群 } 変数名 ; //タイプ1 struct { メンバ宣言群 } 変数名 ;     //タイプ2 struct タグ名 { メンバ宣言群 } ;     //タイプ3 struct タグ名 変数名 ;          //タイプ4 同じ構造体を1度しか使わないならタイプ2の書き方でいいんですが、2回以上書くとなると同じメンバ変数宣言を何度も書くことになって、面倒くさいし間違う可能性が高い。 なにより、sizeof演算子が使いにくい。 だから、たいていの場合はタイプ3の書き方でタグを宣言して、変数宣言やsizeof演算子ではタグ付きのstruct構文を使うわけです。 構造体をtypedefで型宣言する場合、タグは必要ありません。 しかし、記憶クラス指定子は変数宣言と同じ構文が使えなければならないので、タグ付きのstruct構文が有効になっています。