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


Объявления объединений

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

Синтаксис

  • спецификатор-структуры-или-объединения:
    идентификатор-структуры-или-объединения необ { список-объявления-структур**}**

    идентификатор-структуры-или-объединения

  • структура-или-объединение:
    struct

    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;
    }
}

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

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

См. также

Основные понятия

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