История изменений
Исправление slovazap, (текущая версия) :
Если
/* x->b гарантированно был инициализирован */
то почему
do_a(&x->a);
do_b(&x->b);
а не
do_a(&x->b.a);
do_b(&x->b);
А так стандарт явно разрешает же обращаться к union через любой член если ты обращаешься только к полям общим для всех членов. Но я вот что-то не могу сказать, являются ли common initial sequence поля type_a и его включение как структуры. Безопаснее предположить что нет.
Fix: я смотрел в C++ стандарт, но если в C
Two structures share a common initial sequence if corresponding members have compatible types (and, for bit-fields, the same widths) for a sequence of one or more initial members.
то таки скорее, всё-таки, да.
Исправление slovazap, :
Если
/* x->b гарантированно был инициализирован */
то почему
do_a(&x->a);
do_b(&x->b);
а не
do_a(&x->b.a);
do_b(&x->b);
А так стандарт явно разрешает же обращаться к union через любой член если ты обращаешься только к полям общим для всех членов. Но я вот что-то не могу сказать, являются ли common initial sequence поля type_a и его включение как структуры. Безопаснее предположить что нет.
Fix: я смотрел в C++ стандарт, но если в C
Two structures share a common initial sequence if corresponding members have compatible types (and, for bit-fields, the same widths) for a sequence of one or more initial members.
то таки скорее да.
Исходная версия slovazap, :
Если
/* x->b гарантированно был инициализирован */
то почему
do_a(&x->a);
do_b(&x->b);
а не
do_a(&x->b.a);
do_b(&x->b);
А так стандарт явно разрешает же обращаться к union через любой член если ты обращаешься только к полям общим для всех членов. Но я вот что-то не могу сказать, являются ли common initial sequence поля type_a и его включение как структуры. Безопаснее предположить что нет.