Используя компилятор, который поддерживает унифицированный синтаксис инициализации C ++ 11, вы можете использовать инициализированный скобками инициализатор с одним значением, которое будет использоваться для инициализации первого нестатического поля объединения…
MyUnion test{ 0 };
Вы могли бы использовать NULL
вместо нуля в приведенном выше коде, но кажется неясным инициализировать mLong
(то есть ULONG
) с NULL
.
Вы также можете использовать фигурную инициализацию воператор присваивания, если вам нужно установить переменную после того, как она была объявлена…
MyUnion test{ 0 };
// ...
test = { 3 };
Обратите внимание, что синтаксис фигурных скобок инициализатора также может быть доступен в более старых компиляторах, которые предлагают экспериментальную поддержку того, что раньше называлось C++ 0x
Visual Studio 2015 C ++ поддерживает фигурные инициализаторы, если вы не компилируете файл с расширением .c
или не используете переключатель /TC
для компиляции в виде кода C (а не код C ++).
Старые компиляторы C ++ (и C)
При использовании компиляторов, которые не поддерживают инициализацию в фигурных скобках, более старый синтаксис инициализации присваивания может использоваться в объявлениях ...
MyUnion_ test = { 0 };
… Но не в операторах присваивания.
Приведение к типу объединения
Согласно этой статье Центра знаний IBM приведение к типу объединения является расширением C99 "... реализовано для облегчения переноса программ, разработанных с использованием GNU C ", что предполагает, что это не стандартная C.
. Эта документация Microsoft указывает, что для C нет законных приведений в C *1039*.объединение, структура или массив.
В C ++ приведение к типу объединения возможно, если существует подходящий конструктор ...
union MyUnion {
unsigned long mLong;
char mChar;
MyUnion(unsigned long val) { mLong = val; };
};
// valid cast
test = (MyUnion)3ul;
// invalid cast - no suitable constructor exists
void * ptr = 0;
test = (MyUnion)ptr;