C Typedef と構造体の質問

1 つ目は、構造体内で IOPORT を使用して、同じ型のオブジェクトを参照できるようにします。ノードがノードを参照する必要があるリンクされたリストなどの場合に役立ちます。


C には 4 つの異なる名前空間があり、構造体タグの名前空間はその 1 つです。したがって:

struct foo { int bar; };

一般的な意味で新しい型を定義しません。構造タグしかない場合は、次のようにオブジェクト宣言の前にキーワード「struct」を追加する必要があります:

foo b; /* error */
struct foo b; /* correct */

さらに、次のように、定義内で新しいオブジェクトをすぐにインスタンス化できます:

struct foo { int bar; } baz;

ここで、baz は構造体型 foo のオブジェクトです。ただし、記述を節約するために、構造体を新しい型として定義したい場合がよくあります。完全型は構造タグを参照しないため、宣言中に「struct」プレフィックスを省略できます。

typedef struct foo { int bar; } baz;

foo は構造体タグであるため、'struct foo' を使用してオブジェクトを宣言することもできます。しかし今では、「通常の」タイプの名前空間で完全なタイプに昇格され、タイプ baz として知られています。そのため、typedef を使用すると、「baz」フィールドのセマンティクスが異なります。

内部の構造型 (リンクされたリスト、ツリー構造) へのポインターを宣言する必要がない限り、省略します。不要なものを追加すると、名前空間が汚染されるだけです。


どちらのスタイルを優先するかというと、私は 1 番目のスタイル (構造体タグと構造体の typedef の両方に名前を付けたもの) を好みます。単純に、ソース ファイルにいくつかの文字が追加される以外に欠点がないからです。私の IDE の構造体スニペットは両方の場所で名前を削除するため、構造体タグ名とともに typedef された構造体名を常に取得します。

いくつかの小さなメリットがあります:

  • struct STRUCTNAME」 " を使用して、構造体内の構造体へのポインターを宣言できます
  • C または C++ コードで STRUCTNAME を使用するだけで済みます
  • エラーや警告なしで、別のオブジェクトに使用されている構造体名に関係する C++ の潜在的な (実際には非常にまれな場合でも) 奇妙さを防ぎます

しかし、たまたま構造体定義を手動で入力した場合、どちらか一方の名前を宣言するのを怠惰に無視することがよくあります。