Udostępnij za pośrednictwem


union Deklaracje

"Deklaracja unii" określa zestaw wartości zmiennych i opcjonalnie tag nazewnictwa unii. Wartości zmiennych są nazywane "członkami" unii i mogą mieć różne typy. Związki są podobne do "rekordów wariantów" w innych językach.

Składnia

struct-or-union-specifier:
struct-or-unionidentifierZdecydować { struct-declaration-list }
struct-or-union identifier

struct-or-union:
struct
union

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

Zawartość unii jest zdefiniowana jako

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

specifier-qualifier-list:
type-specifierspecifier-qualifier-listZdecydować
type-qualifierspecifier-qualifier-listZdecydować

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

Zmienna z union typem przechowuje jedną z wartości zdefiniowanych przez ten typ. Te same zasady regulują strukturę i deklaracje unii. Związki mogą również zawierać pola bitowe.

Składowe związków nie mogą mieć niekompletnego typu, typu lub typu voidfunkcji. W związku z tym składowe nie mogą być wystąpieniem unii, ale mogą być wskaźnikiem do zadeklarowanego typu unii.

Deklaracja typu unii jest tylko szablonem. Pamięć nie jest zarezerwowana, dopóki zmienna nie zostanie zadeklarowana.

Uwaga

Jeśli zadeklarowano związek dwóch typów, a jedna wartość jest przechowywana, ale do unii uzyskuje się dostęp z innym typem, wyniki są zawodne. Na przykład zadeklarowana jest unia i float int . Wartość float jest przechowywana, ale program później uzyskuje dostęp do wartości jako int. W takiej sytuacji wartość będzie zależeć od wewnętrznego float magazynu wartości. Wartość całkowita nie byłaby niezawodna.

Przykłady

Poniżej przedstawiono przykłady związków:

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

W tym przykładzie zdefiniowano zmienną unii z sign typem i zadeklarowano zmienną o nazwie number , która ma dwa elementy członkowskie: svar, podpisaną liczbę całkowitą i uvar, niepodpisaną liczbę całkowitą. Ta deklaracja umożliwia przechowywanie bieżącej number wartości jako podpisanej lub niepodpisanej wartości. Tag skojarzony z tym typem unii to sign.

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

Tablica screen zawiera 2000 elementów. Każdy element tablicy jest pojedynczym związkiem z dwoma elementami członkowskimi: window1 i screenval. Element window1 członkowski jest strukturą z dwoma elementami członkowskimi icon pól bitowych i color. Element screenval członkowski jest elementem int. W dowolnym momencie każdy element unii zawiera strukturę reprezentowaną int przez screenval element lub strukturę reprezentowaną przez window1element .

Specyficzne dla firmy Microsoft

Zagnieżdżone związki można zadeklarować anonimowo, gdy są członkami innej struktury lub unii. Oto przykład beznazwanej unii:

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

Związki są często zagnieżdżone w strukturze zawierającej pole dające typ danych zawartych w unii w dowolnym momencie. Oto przykład deklaracji dla takiej unii:

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

Aby uzyskać informacje na temat odwoływania się do związków zawodowych, zobacz Struktura i członkowie unii.

END Microsoft Specific

Zobacz też

Deklaratory i deklaracje zmiennych