Бьерн Страуструп.
Язык программирования С++
68
int
i;
int*
p;
};
};
fudge a;
a.i = 4095;
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).
Достарыңызбен бөлісу: