C++では、次の間に違いがありますか:
struct Foo { ... };
そして:
typedef struct { ... } Foo;
ベストアンサー1
C++ では、わずかな違いしかありません。これは C から引き継がれたもので、違いを生みます。
C言語標準(C89 §3.1.2.3、C99 §6.2.3、 そしてC11 §6.2.3) は、タグ識別子( struct
/ union
/の場合enum
)や通常の識別子(およびtypedef
その他の識別子の場合)など、異なるカテゴリの識別子に対して個別の名前空間を義務付けています。
もしあなたがこう言ったとしたら:
struct Foo { ... };
Foo x;
Foo
はタグ名前空間でのみ定義されているため、コンパイラ エラーが発生します。
次のように宣言する必要があります:
struct Foo x;
を参照したいときはいつでもFoo
、それを と呼ぶ必要がありますstruct Foo
。これはすぐに面倒になりますので、 を追加することができますtypedef
:
struct Foo { ... };
typedef struct Foo Foo;
これで、struct Foo
(タグ名前空間内) と単なるFoo
(通常の識別子名前空間内) の両方が同じものを参照するようになり、キーワードFoo
なしで型のオブジェクトを自由に宣言できるようになりましたstruct
。
構造:
typedef struct Foo { ... } Foo;
は宣言と の略語にすぎませんtypedef
。
ついに、
typedef struct { ... } Foo;
匿名構造体を宣言し、typedef
それに対して を作成します。したがって、この構造では、タグ名前空間に名前はなく、typedef 名前空間にのみ名前があります。つまり、前方宣言することもできません。前方宣言を行う場合は、タグ名前空間に名前を付ける必要があります。
C++では、名前が同じ名前の別の宣言によって隠されていない限り、すべてのstruct
/ union
/ enum
/class
宣言は暗黙的に'されているかのように動作します。typedef
マイケル・バーの回答詳細については、こちらをご覧ください。