Deklaracje złożeń
"Deklaracja związku" określa zbiór wartości zmiennych, a także, opcjonalnie, tag nazywający związek.Wartości zmiennych są nazywane "elementami członkowskimi" związku i mogą mieć różne typy.Związki są podobne do "rekordów wariantowych" w innych językach.
Składnia
specyfikator-struktury-lub-związku:
identyfikator struktury-lub-związku opc**{** lista-deklaracji-struktury }identyfikator struktury-lub-związku
struktura-lub-związek:
struktunia
lista-deklaracji-struktury:
deklaracja-strukturylista-deklaracji-struktury deklaracja-struktury
Zawartość związku jest definiowana jako
deklaracja-struktury:
lista-kwalifikatorów-struktury lista-deklaratorów-struktury ;lista-kwalifikatorów-struktury:
specyfikator-typu lista-kwalifikatorów-struktury opckwalifikator-typu lista-kwalifikatorów-specyfikatora opc
lista-deklaratorów-struktury:
deklarator-strukturylista-deklaratorów-struktury , deklarator-struktury
Zmienna typu union przechowuje jedną z wartości zdefiniowanych przez ten typ.Te same zasady kierują deklaracjami struktur i związków.Związki mogą również mieć pola bitowe.
Elementy członkowskie związków nie mogą mieć niekompletnego typu, typu void ani typu funkcji.Dlatego elementy członkowskie nie mogą być wystąpieniem związku, ale mogą być wskaźnikiem do zadeklarowanego typu związku.
Deklaracja typu związku jest tylko szablonem.Pamięć nie jest zarezerwowana do czasu zadeklarowania zmiennej.
[!UWAGA]
Jeżeli zadeklarowano związek dwóch typów i przechowywana jest jedna wartość, ale związek jest dostępny z innego typu, wyniki są nierzetelne.Na przykład, zdeklarowany jest związek float i int.Przechowywana jest wartość float, ale program później ma dostęp do wartości jako int.W takiej sytuacji, wartość będzie zależeć od wewnętrznej pamięci wartości float.Wartość całkowita nie jest rzetelna.
Przykłady
Oto przykłady związków:
union sign /* A definition and a declaration */
{
int svar;
unsigned uvar;
} number;
W tym przykładzie zdefiniowano zmienną union typu sign i zmienną o nazwie number, która ma dwa elementy członkowskie: svar typu signed integer i uvar typu unsigned integer.Deklaracja ta umożliwia przechowywanie bieżącej wartości number jako wartość ze znakiem lub bez znaku.Tag skojarzony z tym typem związku 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 indywidualnym związkiem z dwoma elementami członkowskimi: window1 i screenval.Element członkowski window1 jest strukturą z dwoma członkowskimi polami bitowymi, icon i color.Element członkowski screenval jest typu int.W każdej chwili, każdy element związku posiada int reprezentowany przez screenval lub strukturę reprezentowaną przez window1.
Specyficzne dla firmy Microsoft
Zagnieżdżone związki mogą być deklarowane anonimowo, gdy są członkami innej struktury lub związku.Jest to przykład związku bez nazwy:
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 często są zagnieżdżone wewnątrz struktury, która zawiera pole podające typ danych zawartych w związku w dowolnym czasie.Jest to przykład deklaracji takiego związku:
struct x
{
int type_tag;
union
{
int x;
float y;
}
}
Zobacz Struktury i związki członkowskie, aby uzyskać informacje dotyczące odwoływania się do związków.
KONIEC informacji specyficznych dla firmy Microsoft