1. ホーム
  2. c++

[解決済み] C++の'struct'と'typedef struct'の違い?

2022-03-20 05:54:19

質問

C++ の間に何か違いがあるのでしょうか?

struct Foo { ... };

とします。

typedef struct { ... } Foo;

解決方法は?

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 'ed、ただし同名の他の宣言によって名前が隠されていない限り。 参照 Michael Burrの回答 をご覧ください。