Объединение – это средство, позволяющее размещать данные различных типов в одном и том же месте оперативной памяти. С точки зрения грамматики языка С, всякое объединение является переменной, принимающей в различное время выполнения программы значения различных типов. Объединение можно считать структурой, в которой в каждый момент времени можно использовать для хранения значения только одно поле.
Синтаксис описания объединения следующий.
union
{
тип поле1;
тип поле2;
…
} идентификатор1, идентификатор2, …;
Схематически переменная типа объединения представлена на Рис. 48. Размер, который занимает переменная типа объединения, равен размеру максимального поля.
Рис. 48
Доступ к конкретному полю такой же, как для структур.
идентификатор.поле
Тип значения, которое будет доступно по такому обращению, соответствует типу параметра поле.
Также как и для структур возможно описание тега объединения.
union тег
{
тип поле1;
тип поле2;
…
};
Тогда переменную можно описать как
|
|
union тег идентификатор;
Ключевое слово union может быть опущено.
В примере реализована передача значения произвольного типа в некоторую функцию.
enum e_val_type
{
VT_INT,
VT_LONG,
VT_SHORT,
VT_FLOAT,
VT_DOUBLE
};
union u_val
{
int int_val;
long long_val;
short short_val;
float float_val;
double double_val;
};
void func(u_val val, e_val_type type)
{
switch(type)
{
case VT_INT:
//обработка значения типа int
cout << val.int_val;
…
break;
case VT_LONG:
//обработка значения типа long
cout << val.long_val;
…
break;
case VT_SHORT:
//обработка значения типа short
cout << val.short_val;
…
break;
case VT_FLOAT:
//обработка значения типа float
cout << val.float_val;
…
break;
case VT_DOUBLE:
//обработка значения типа double
cout << val.double_val;
…
break;
}
}
void main()
{
…
u_val param;
param.float_val = 178.6f;
func(param, VT_FLOAT);
…
}
В главной функции переменной param присваивается значение типа float. Далее значение передается в функцию, в которую также передается тип значения, описанный в перечислении e_val_type. В самой функции проверяется тип переданного значения и выполнятся те операции, которые необходимо выполнить именно со значением этого типа.