次の方法で共有


union の宣言

"共有体宣言" は、一連の変数の値、および共有体に名前を付けるタグ (オプション) を指定します。 変数の値は共用体の "メンバー" と呼ばれ、異なる型を指定できます。 共有体は他の言語における "バリアント レコード" に似ています。

構文

struct-or-union-specifier:
struct-or-union identifier opt{ 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-listopt
type-qualifier specifier-qualifier-listopt

struct-declarator-list:
struct-declarator
struct-declarator-list , struct-declarator

union の型の変数は、その型で定義されている値のいずれか 1 つを保存します。 同じ規則が構造体と共有体の宣言を制御します。 共有体には、ビット フィールドも設定できます。

共用体のメンバーは、不完全な型、void 型、または関数型を持つことができません。 したがって、メンバーを共用体のインスタンスにすることはできませんが、宣言されている共用体型へのポインターにすることはできます。

共有体型宣言は、テンプレートだけです。 メモリは、変数が宣言されるまで予約されません。

注意

2 の型の 1 つの共用体が宣言され、一方の値が格納されていても、もう一方の型で共用体にアクセスできる場合、結果は信頼できません。 たとえば、 floatint の共用体が宣言されます。 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 つのメンバー window1screenval を持つ個別の共用体です。 window1 メンバーは、2 つのビット フィールド メンバー (iconcolor) を持つ構造体です。 screenval メンバーは int です。 常に、各共用体の要素は int によって表される screenvalwindow1 によって表される構造体を保持します。

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 固有の仕様はここまで

関連項目

宣言子と変数宣言