共用体の宣言
"共有体宣言" は、一連の変数の値、および共有体に名前を付けるタグ (オプション) を指定します。 変数の値は共用体の "メンバー" と呼ばれ、異なる型を指定できます。 共有体は他の言語における "バリアント レコード" に似ています。
構文
struct-or-union-specifier:
struct-or-unionidentifieropt{struct-declaration-list}
struct-or-unionidentifier
struct-or-union:
struct
union
struct-declaration-list:
struct-declaration
struct-declaration-liststruct-declaration
共用体の内容は、次のように定義されます
struct-declaration:
specifier-qualifier-liststruct-declarator-list;
specifier-qualifier-list:
type-specifierspecifier-qualifier-listopt
type-qualifierspecifier-qualifier-listopt
struct-declarator-list:
struct-declarator
struct-declarator-list,struct-declarator
union の型の変数は、その型で定義されている値のいずれか 1 つを保存します。 同じ規則が構造体と共有体の宣言を制御します。 共有体には、ビット フィールドも設定できます。
共有体のメンバーは不完全な型、void 型、または関数型を持つことができません。 したがって、メンバーを共用体のインスタンスにすることはできませんが、宣言されている共用体型へのポインターにすることはできます。
共有体型宣言は、テンプレートだけです。 メモリは、変数が宣言されるまで予約されません。
注意
2 の型の 1 つの共用体が宣言され、一方の値が格納されていても、もう一方の型で共用体にアクセスできる場合、結果は信頼できません。 たとえば、 float と int の共用体が宣言されます。 float 値が保存されますが、プログラムでは後で int として値にアクセスします。 このような場合、値は float 値の内部ストレージによって異なります。 整数値は信頼できません。
例
共用体の例を次に示します。
union sign /* A definition and a declaration */
{
int svar;
unsigned uvar;
} number;
この例では、sign 型の共有体変数を定義し、2 つのメンバー (符号付き整数の number および符号なし整数の svar) を持つ uvar という名前の変数を宣言します。 この宣言によって、number の現在の値を、符号付きまたは符号なしの値として保存できるようになります。 この共有体に関連付けられているタグは sign です。
union /* Defines a two-dimensional */
{ /* array named screen */
struct
{
unsigned int icon : 8;
unsigned color : 4;
} window1;
int screenval;
} screen[25][80];
screen 配列には 2,000 の要素が含まれます。 配列の各要素は、2 つのメンバー window1 と screenval を持つ個別の共用体です。 window1 メンバーは、2 つのビット フィールド メンバー (icon と color) を持つ構造体です。 screenval メンバーは int です。 常に、各共用体の要素は int によって表される screenval か window1 によって表される構造体を保持します。
Microsoft 固有の仕様
入れ子になった共有体は、別の構造体または共用体のメンバーであるとき匿名で宣言できます。 無名の共用体の例を次に示します。
struct str
{
int a, b;
union / * Unnamed union */
{
char c[4];
long l;
float f;
};
char c_array[10];
} my_str;
.
.
.
my_str.l == 0L; /* A reference to a field in the my_str union */
共有体は、多くの場合、特定の時間に共有体に含まれるデータの型を指定するフィールドを含む構造体の中に入れ子になっています。 これは、このような共用体の宣言の例です。
struct x
{
int type_tag;
union
{
int x;
float y;
}
}
共有体の参照については、「構造体メンバーと共用体メンバー」を参照してください。
Microsoft 固有の仕様はここまで