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


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 — это структура с двумя бит-полями и iconcolor. Элемент screenval является элементом int. В любое время каждый элемент объединения содержит либо представленнуюscreenval, либо int структуру, 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

См. также

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