208 Часть II. Программирование на C++
и объединения
union union_name {
// элементы );
Объединения удобно использовать для определения одиночного значения, которое может быть представлено различными типами данных. Объединения являются очень полезными при неявных преобразованиях представлений типов данных.
Приведем пример программы, преобразующей 16-разрядные упакованные целочисленные величины, используемые в каталогах файловой системы. Альтернативой этому могло бы быть использование операций побитного сдвига («, ») и логических операций маскирования битов в упакованных данных, для чего потребовалась бы масса дополнительного кода, что всегда чревато ошибками. Данная программа использует битовые поля общей длиной 16 бит, и объединение для наложения упакованных данных* на битовые поля.
1 // UNION.СРР — Демонстрирует неявное преобразование типов //с помощью объединений
2 ftinclude <dlr.h>
3 #include <dos.h>
4 #include <stdio.h>
5 ftinclude <iostream.h>
6 // Для неявного преобразования типов используются // структуры и объединения
7 struct DOS_DATE
8 {
9 unsigned int day:5; // 5-битное поле
10 unsigned int month:4; // 4-битное поле
11 unsigned int year:7; // 7-битное поле
12 };
13 // Объединение связывает два типа вместе
14 union IMPLICIT_DATE_CONVERSION
L5 {
L6 unsigned int packed date;
17 struct DOS_DATE unpacked_date;
L8 };
L9 typedef union IMPLICIT_DATE_CONVERSION DATE;
!0 void main()
'1 (
'2 struct ffblk ffblk;
!3 int done = findfirst( "*.*", sffblk, 0) ;