В Си можно сделать так:
#include <stdint.h>
// Объявляю тип объединения
typedef union {
uint32_t Word;
uint16_t HWord[2];
uint8_t Byte[4];
} WordUnion_t;
// Объявляю и инициализирую константный массив из 3-х объединений
const WordUnion_t MyVal[3] = {
{.Byte = {0x12,0x34,0x12,0x34}}, // Это объединение инициализировано, как массив байт
{.HWord = {0x5678,0x1234}}, // Это объединение инициализировано, как массив полуслов
{.Word = 0x12345678} // Это объединение инициализировано, как массив слов
};
С++ такое не поддерживает. Ему нельзя явно задать поле объединения, которое я хочу инициализировать.
Убираем имена полей и пытаемся инициализировать, как обычные структуры в С++:
const WordUnion_t MyVal[3] = {
{0x12,0x34,0x12,0x34},
{0x5678,0x1234},
{0x12345678}
};
Компилятор и на это ругается. Только элемент MyVal[2], по его мнению, инициализирован верно.
Эксперимент показал, что инициализировать объединение в С++ можно только по полю, объявленному первым при описании этого объединения. В моем случае, по .Word. Что бы мы ни писали в инициализаторах, он расценивает это, как значение поля Word.
Собственно, вопрос: а если мне надо/удобно инициализировать моё объединение по другому полю, неужели синтаксис языка этого не позволяет?
Странное впечатление создается. Язык большой, развесистый, позволяет сделать кучу всего несколькими разными способами, а такого простого действия, как инициализации нужного поля объединения - не позволяет.