union
Объявления
Объявление объединения определяет набор значений переменных и при необходимости тег, который именует объединение. Значения переменных называются членами объединения и могут иметь различные типы. Объединения аналогичны вариантным записям в других языках.
Синтаксис
struct-or-union-specifier
:
struct-or-union
identifier
необ.{
struct-declaration-list
}
struct-or-union
identifier
struct-or-union
:
struct
union
struct-declaration-list
:
struct-declaration
struct-declaration-list
struct-declaration
Содержимое объединения определено как
struct-declaration
:
specifier-qualifier-list
struct-declarator-list
;
specifier-qualifier-list
:
type-specifier
specifier-qualifier-list
необ.
type-qualifier
specifier-qualifier-list
необ.
struct-declarator-list
:
struct-declarator
struct-declarator-list
,
struct-declarator
Переменная с типом union
хранит одно из значений, определенных в этом типе. Объявления структуры и объединения подчиняются тем же правилам. Объединения также могут иметь битовые поля.
Члены профсоюзов не могут иметь неполный тип, тип 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
.
Блок, относящийся только к системам Майкрософт
Вложенные профсоюзы могут быть объявлены анонимно, когда они являются членами другой структуры или объединения. Ниже приведен пример безымяного объединения:
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;
}
}
Дополнительные сведения о ссылках на объединения см. в разделе Члены структур и объединений.
Завершение блока, относящегося только к системам Майкрософт