"構造体宣言" は型に名前を付け、異なる型を持つ変数値のシーケンス (構造体の "メンバー" または "フィールド" と呼ばれます) を指定します。 "タグ" と呼ばれる省略可能な識別子は、構造体の型の名前を指定し、構造体型への後続の参照で使用できます。 その構造体型の変数は、その型によって定義されたシーケンス全体を保持します。 C の構造体は、他の言語の "レコード" と呼ばれる型に似ています。
構文
struct-or-union-specifier:
struct-or-union
identifier
選ぶ{struct-declaration-list}
struct-or-union
identifier
struct-or-union:
struct
union
struct-declaration-list:
struct-declaration
struct-declaration-list
struct-declaration
struct-declaration:
specifier-qualifier-list
struct-declarator-list
;
specifier-qualifier-list:
type-specifier
specifier-qualifier-list
選ぶ
type-qualifier
specifier-qualifier-list
選ぶ
struct-declarator-list:
struct-declarator
struct-declarator-list
,
struct-declarator
struct-declarator:
declarator
type-specifier
declarator
選ぶ:constant-expression
構造体型の宣言では、構造体の領域は確保されません。 これは、後で構造体変数を宣言するためのテンプレートにすぎません。
以前に定義した identifier (タグ) を使用して、他の場所で定義されている構造体型を参照できます。 この場合、定義が表示されている限り、 struct-declaration-list を繰り返すことはできません。 構造体へのポインターの宣言と構造体型の typedef は、構造体型が定義される前に構造体タグを使用できます。 ただし、フィールドのサイズを実際に使用する前に、構造体定義を検出する必要があります。 この使用は、型と型タグの不完全な定義です。 この定義を完了するには、後で同じスコープに型定義を指定する必要があります。
struct-declaration-listは、構造体メンバーの型と名前を指定します。
struct-declaration-list引数には、1 つ以上の変数またはビット フィールド宣言が含まれています。
struct-declaration-listで宣言された各変数は、構造体型のメンバーとして定義されます。
struct-declaration-list内の変数宣言は、このセクションで説明する他の変数宣言と同じ形式になりますが、宣言にストレージ クラス指定子または初期化子を含めることはできません。 構造体のメンバーは、型 void、不完全な型、または関数型を除く任意の変数型を持つことができます。
メンバーが表示される構造体の型を持つよう宣言することはできません。 ただし、構造体型にタグがある限り、メンバーは構造体型へのポインターとして宣言できます。 これにより、構造のリンクされたリストを作成できます。
構造体は、他の識別子と同じスコープに従います。 構造体識別子は、同じ可視性を持つ他の構造体、共用体、および列挙タグとは異なる必要があります。
struct-declaration-list内の各struct-declarationは、リスト内で一意である必要があります。 ただし、 struct-declaration-list 内の識別子名は、通常の変数名や他の構造体宣言リストの識別子と区別する必要はありません。
入れ子になった構造体は、ファイル スコープ レベルで宣言されているかのようにアクセスすることもできます。 たとえば、次の宣言があるとします。
struct a
{
int x;
struct b
{
int y;
} var2;
} var1;
これらの宣言はどちらも有効です。
struct a var3;
struct b var4;
例示
これらの例は、構造体の宣言を示しています。
struct employee /* Defines a structure variable named temp */
{
char name[20];
int id;
long class;
} temp;
employee構造体には、name、id、classの 3 つのメンバーがあります。
name メンバーは 20 要素の配列であり、idとclassはそれぞれ、int型とlong型を持つ単純なメンバーです。
employee識別子は構造体識別子です。
struct employee student, faculty, staff;
この例では、 student、 faculty、 staffの 3 つの構造体変数を定義します。 各構造体には、3 つのメンバーの同じリストがあります。 メンバーは、前の例で定義した構造体型が employeeするように宣言されています。
struct /* Defines an anonymous struct and a */
{ /* structure variable named complex */
float x, y;
} complex;
complex構造体には、xとyの 2 つのメンバーfloat型があります。 構造体型にはタグがないため、名前が付いていないか匿名です。
struct sample /* Defines a structure named x */
{
char c;
float *pf;
struct sample *next;
} x;
構造体の最初の 2 つのメンバーは、 char 変数と float 値へのポインターです。 3 番目のメンバー ( next) は、定義されている構造体型 (sample) へのポインターとして宣言されます。
匿名構造体は、1 つの宣言ですべての構造体インスタンスを定義する場合など、タグ名が必要ない場合に便利です。 例えば次が挙げられます。
struct
{
int x;
int y;
} mystruct;
多くの場合、埋め込み構造体は匿名です。
struct somestruct
{
struct /* Anonymous structure */
{
int x, y;
} point;
int type;
} w;
Microsoft 固有の仕様
コンパイラでは、構造体の最後のメンバーとして、サイズが変更されていない配列またはサイズが 0 の配列を使用できます。 これは、さまざまな状況で定数配列のサイズが異なる場合に便利です。 このような構造体の宣言は次のようになります。
struct
identifier
{
set-of-declarations
type
array-name
[]; };
未初期化の配列は、構造体の最後のメンバーとしてのみ使用できます。 非初期化配列宣言を含む構造体は、外側の構造体でそれ以上メンバーが宣言されていない限り、他の構造体内で入れ子にすることができます。 このような構造体の配列は許可されません。
sizeof演算子は、この型の変数または型自体に適用される場合、配列のサイズに対して 0 を想定します。
構造体宣言は、宣言子が別の構造体または共用体のメンバーである場合に、宣言子なしで指定することもできます。 フィールド名は、外側の構造に昇格されます。 たとえば、名前のない構造体は次のようになります。
struct s
{
float y;
struct
{
int a, b, c;
};
char str[10];
} *p_s;
.
.
.
p_s->b = 100; /* A reference to a field in the s structure */
構造体参照の詳細については、「 構造体と共用体のメンバー」を参照してください。
Microsoft 固有の仕様はここまで