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-union
identifier
Zdecydować {
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-specifier
specifier-qualifier-list
Zdecydować
type-qualifier
specifier-qualifier-list
Zdecydować
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 void
funkcji. 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 window1
element .
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