0

重複の可能性:
C++ の「構造体」と「typedef 構造体」の違い?

構造体の次の定義の違いを誰かが説明できますか

typedef struct
{
}GOOD;

&

struct GOOD
{
};

&

typedef struct tagGOOD
{
}GOOD;

私の先生は最後の例を使用していますが、構造体名に「タグ」を使用する理由がよくわかりません (それが名前の場合)。誰かがそれを明確にしてもらえますか?

4

5 に答える 5

1

構造には次の名前が付いているはずです。

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;
于 2012-09-13T02:25:28.860 に答える
1

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

于 2012-09-13T02:28:26.433 に答える
0

定義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形式はかなり無意味です。

于 2012-09-13T02:23:39.987 に答える