union Deklarationer

En "unionsdeklaration" anger en uppsättning variabelvärden och, om du vill, en tagg som namnger unionen. Variabelvärdena kallas "medlemmar" i unionen och kan ha olika typer. Fackföreningar liknar "variantposter" på andra språk.

Syntax

struct-or-union-specifier:
struct-or-union identifier välja{struct-declaration-list}
struct-or-union identifier

struct-or-union:
struct
union

struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration

Unionsinnehållet definieras som

struct-declaration:
specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list:
type-specifier specifier-qualifier-list välja
type-qualifier specifier-qualifier-list välja

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

En variabel med union typen lagrar ett av de värden som definierats av den typen. Samma regler styr struktur- och fackliga deklarationer. Unioner kan också ha bitfält.

Medlemmar i fackföreningar kan inte ha en ofullständig typ, typ voideller funktionstyp. Därför kan medlemmar inte vara en instans av facket utan kan vara pekare på den unionstyp som deklareras.

En deklaration av unionstyp är endast en mall. Minnet är inte reserverat förrän variabeln har deklarerats.

Anmärkning

Om en union av två typer deklareras och ett värde lagras, men unionen nås med den andra typen, är resultatet otillförlitligt. Till exempel deklareras en union av float och int . Ett float värde lagras, men programmet kommer senare åt värdet som en int. I en sådan situation skulle värdet vara beroende av den interna lagringen av float värden. Heltalsvärdet skulle inte vara tillförlitligt.

Exempel

Följande är exempel på fackföreningar:

union sign   /* A definition and a declaration */
{
    int svar;
    unsigned uvar;
} number;

Det här exemplet definierar en unionsvariabel med sign typen och deklarerar en variabel med namnet number som har två medlemmar: svar, ett signerat heltal och uvar, ett osignerat heltal. Med den här deklarationen kan det aktuella värdet number lagras som antingen ett signerat eller ett osignerat värde. Taggen som är associerad med den här unionstypen är sign.

union               /* Defines a two-dimensional */
{                   /*  array named screen */
    struct
    {
      unsigned int icon : 8;
      unsigned color : 4;
    } window1;
    int screenval;
} screen[25][80];

Matrisen screen innehåller 2 000 element. Varje element i matrisen är en enskild union med två medlemmar: window1 och screenval. Medlemmen window1 är en struktur med två bitfältsmedlemmar icon och color. Medlemmen screenval är en int. Vid varje given tidpunkt innehåller varje unionselement antingen den int som representeras av screenval eller strukturen som representeras av window1.

Microsoft-specifik

Kapslade fackföreningar kan deklareras anonymt när de är medlemmar i en annan struktur eller union. Här är ett exempel på en namnlös union:

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 */

Unioner är ofta kapslade i en struktur som innehåller ett fält som ger den typ av data som ingår i unionen vid en viss tidpunkt. Här är ett exempel på en förklaring för en sådan union:

struct x
{
    int type_tag;
    union
    {
      int x;
      float y;
    }
}

Se Struktur- och unionsmedlemmar för information om att referera till fackföreningar.

Avsluta Microsoft Specifik

Se även

Deklaratorer och variabeldeklarationer