Объявления объединений
Объявление объединения определяет набор значений переменных и при необходимости тег, который именует объединение. Значения переменных называются членами объединения и могут иметь различные типы. Объединения аналогичны вариантным записям в других языках.
Синтаксис
спецификатор-структуры-или-объединения:
идентификатор-структуры-или-объединения необ { список-объявления-структур**}**идентификатор-структуры-или-объединения
структура-или-объединение:
structunion
список-объявлений-структуры:
объявление-структурысписок-объявлений-структуры объявление-структуры
Содержимое объединения определено как
объявление-структуры:
список-квалификаторов-описателей список-деклараторов-структуры ;список-спецификаторов-и-квалификаторов:
спецификатор-типа список-спецификаторов-и-квалификаторов необквалификатор-типа список-спецификаторов-и-квалификаторов необ
список-деклараторов-структуры:
декларатор-структурысписок-деклараторов-структуры**,** декларатор-структуры
Переменная с типом объединение хранит одно из значений, определенных этим типом. Объявления структуры и объединения подчиняются тем же правилам. Объединения также могут иметь битовые поля.
Члены объединений не могут иметь неполный тип, тип void или тип функции. Поэтому члены могут быть указателями на объявляемый тип объединения, но не экземпляром объединения.
Объявление типа объединения — это лишь шаблон. Память не резервируется, пока не будет объявлена переменная.
Примечание
Если объявляется объединение двух типов и сохраняется одно значение, но для доступа к объединению используется другой тип, результаты будут ненадежными.Например, объявлено объединение float и int.Значение float сохраняется, но впоследствии программа обращается к значению как к int.В этом случае значение будет зависеть от внутреннего хранилища значений float.Целочисленное значение будет ненадежным.
Примеры
Ниже представлены примеры объединений.
union sign /* A definition and a declaration */
{
int svar;
unsigned uvar;
} number;
В этом примере определяется переменная объединения с типом sign и объявляется переменная 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 содержит 2000 элементов. Каждый элемент массива представляет собой отдельное объединение с двумя членами: window1 и screenval. Член window1 является структурой с двумя членами-битовыми полями: icon и color. Член screenval представляет собой int. В любой момент времени каждый элемент объединения содержит значение int, представленное screenval, либо структуру, представленную значением window1.
Блок, относящийся только к системам 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