重複の可能性:
C++ の「構造体」と「typedef 構造体」の違い?
構造体の次の定義の違いを誰かが説明できますか
typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
私の先生は最後の例を使用していますが、構造体名に「タグ」を使用する理由がよくわかりません (それが名前の場合)。誰かがそれを明確にしてもらえますか?
重複の可能性:
C++ の「構造体」と「typedef 構造体」の違い?
構造体の次の定義の違いを誰かが説明できますか
typedef struct
{
}GOOD;
&
struct GOOD
{
};
&
typedef struct tagGOOD
{
}GOOD;
私の先生は最後の例を使用していますが、構造体名に「タグ」を使用する理由がよくわかりません (それが名前の場合)。誰かがそれを明確にしてもらえますか?
構造には次の名前が付いているはずです。
struct StructName {
// stuff
};
Typedefは型を取り、それに名前を付けます。
typedef SomeType NameYouWannaGiveThatType;
3番目の例はこれらを組み合わせたものです。
この例は名前のない構造体であり、一部のコンパイラーはこれに腹を立てています。
2番目の例は名前付き構造体ですが、従来、構造体という単語を含めずに参照することはできませんでした。 例えば
struct MyStruct {
//...
};
MyStruct iffy; // Not allowed in C, in my experience anyway
struct MyStruct good; // No problem.
これがC++で問題になることはわかりませんが、C ++の仕様を逆に知っていて、より良い答えを提供してくれる人がいると思います。とにかく、typedefでこれを回避します。
typedef MyStruct { /* etc */ } MyStruct;
MyStruct s;
個人的に、そしてこれはおそらくスタイルの問題ですが、私は同じ名前を使用しないことを好みます:
typedef MyStruct { /* etc */ } SMyStruct;
C ++について話しているのであれば、typedefは実際には必要ないと思います。物語は実際にはCから来ています。
Cで、私が宣言するとき
struct GOOD_STRUCT {
...
}
この構造体の変数を宣言したいときは、次のことを行う必要があります
struct GOOD_STRUCT good;
より良いコーディングスタイルと読みやすさを実現するために、人々はこれについてtypedefを使用していました。
typedef GOOD_STRUCT GOOD;
だからあなたはすることができます
GOOD good;
両方を組み合わせるために、人々は
typedef struct GOOD_STRUCT {
...
} GOOD;
また
typedef struct {
...
} GOOD;
ただし、C ++では、これは不要になりました。宣言したら、直接struct GOOD
参照することができます。GOOD
定義1:
匿名(空の)構造体を定義し、それにtypedefをGOOD
。このタイプは、単にGOOD
将来のように参照することができます。
定義2:
。という名前の(空の)構造体を定義しGOOD
ます。CおよびC++では、これはと呼ばれstruct GOOD
、C++ではこれはと呼ばれGOOD
ます。
定義3:
名前付きの(空の)構造体と。tagGOOD
という名前のtypedefを定義しますGOOD
。CおよびC++では、構造体はとの両方struct tagGOOD
と呼ばれGOOD
、C++ではこれはと呼ばれtagGOOD
ます。
私の経験では、定義3はCコードで最も一般的である傾向があります。匿名の構造体はあまり好きではない傾向があるため、構造体に名前を付けますがstruct
、型を参照するときにキーワードを使用することも嫌いなので、typedefも付けます。C ++では、typedef形式はかなり無意味です。