>>  Немного устаревшие сведения :). Я сам так думал, но вот
>>  ISO/IEC 9899 (http://www.open-std.org/jtc1/sc22/wg14/)
>>  утверждает следующее:
>> 
>>  6.7.8 Initialization
>>  ....
>> 38 EXAMPLE 13 Any member of a union can be initialized:
>>        union { /* ... */ } u = { .any_member = 42 };
>> 
>> 
>>  Так что в С99 можно union инициализовать через любое поле
>>  по стандарту.

именованный union можно. а неименованный похоже никак :)

> Оок, мои знания о Си дарованы Керниганом-Ритчи. Ну тогда вообще в чём
> проблема? Структуру с анонимными struct/union инициализируем не по
> полям, а линейно, это работает.

работает, но очень некрасиво.

мы микроконтроллеры программируем. поскольку там на борту всего 0.5-1К
RAM то эта RAM экономится жестко. соответственно всякие поля зачастую
упаковываются в байты:

struct something {
    uint8_t type;
    union {
        struct {
            unsigned flag1:1;
            unsigned field1:5;
            unsigned field2:2;
        };

        struct {
            unsigned bla:2;
            int      ble:3;
            int      bee:3;
        };
    };
}

в зависимости от типа type либо одна часть либо другая часть union
актуальна. ну и можно сюда добавить uint8_t data и проинициализировать
union скажем числом 0x23, но это будет довольно
 * нечитабельно
 * болезненно переживать смену порядка/набора полей в union
-- 

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: un...@debian.org jabber://un...@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment: signature.asc
Description: Digital signature

Ответить