Страница:
88 из 357
Объединения иногда используют для «объединения и преобразование типа» (это делают главным образом программисты, воспитанные на языках, не обладающих средствами преобразования типов, где жульничество является необходимым). Например, это «преобразует» на VAX'е int в int*, просто предполагая побитовую эквивалентность:
struct fudge (* union (* int i; int* p; *); *);
fudge a; a.i = 4096; int* p = a.p; // плохое использование
Но на самом деле это совсем не преобразование: на некоторых машинах int и int* занимают неодинаковое количество памяти, а на других никакое целое не может иметь нечетный адрес. Такое применение объединений непереносимо, а есть явный способ указать преобразование типа (#3.2.5).
Изредка объединения умышленно применяют, чтобы избежать преобразования типов. Можно, например, использовать fudge, чтобы узнать представление указателя 0:
fudge.p = 0; int i = fudge.i; // i не обязательно должно быть 0
Можно также дать объединению имя, то есть сделать его полноправным типом. Например, fudge можно было бы описать так:
union fudge (* int i; int* p; *);
и использовать (неправильно) в точности как раньше. Имеются также и оправданные применения именованных объединений, см. #5.4.6.
2.6 Упражнения
1. (*1) Заставьте работать программу с «Hello, world» (1.1.1).
2. (*1) Для каждого описания в #2.1 сделайте следующее: Если описание не является определением, напишите для него определение. Если описание является определением, напишите для него описание, которое при этом не является определением.
3. (*1) Напишите описания для: указателя на символ; вектора из 10 целых; ссылки на в�
|< Пред. 86 87 88 89 90 След. >|