LINUX.ORG.RU

История изменений

Исправление 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 и его включение как структуры. Безопаснее предположить что нет.