208 Часть II. Программирование на C++

и объединения

union union_name {

// элементы );

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

Приведем пример программы, преобразующей 16-разрядные упакованные целочисленные величины, используемые в каталогах файловой системы. Альтернативой этому могло бы быть использование операций побитного сдвига («, ») и логических операций маскирования битов в упакованных данных, для чего потребовалась бы масса дополнительного кода, что всегда чревато ошибками. Данная программа использует битовые поля общей длиной 16 бит, и объединение для наложения упакованных данных* на битовые поля.

h02081.jpg

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