Поделиться через


union Объявления

Объявление объединения определяет набор значений переменных и при необходимости тег, который именует объединение. Значения переменных называются членами объединения и могут иметь различные типы. Объединения аналогичны вариантным записям в других языках.

Синтаксис

struct-or-union-specifier:
struct-or-unionidentifieropt{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-specifierspecifier-qualifier-listнеоб.
type-qualifierspecifier-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.

Блок, относящийся только к системам 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;
    }
}

Дополнительные сведения о ссылках на объединения см. в разделе Члены структур и объединений.

Завершение блока, относящегося только к системам Майкрософт

См. также

Деклараторы и объявления переменных