Говорит стандарт C, касающийся анонимных структур и объединений:
6.7.2.1 p13. Неименованный элемент, спецификатор типа которого является спецификатором структуры без тега, называется анонимной структурой; неназванный член, спецификатор типа которого является спецификатором объединения без тега, называется анонимным объединением. Члены анонимной структуры или объединения считаются членами структуры или объединения. Это применяется рекурсивно, если содержащая структура или объединение также анонимны.
Обратите внимание на акцент: вместо того, чтобы члены анонимной структуры/объединения находились в рамках структуры struct/union, они полностью являются ее членами. Но к этому относятся обязанности:
6.7.2.1 p16. Размер объединения достаточен для того, чтобы содержать самый большой из его членов. Значение не более одного из членов может быть сохранено в объединенном объекте в любое время. Указатель на объект объединения, соответствующим образом преобразованный, указывает на каждый из его членов (или член является битовым полем, а затем на единицу, в которой он находится) и наоборот.
В совокупности они, похоже, подразумевают, что члены анонимной структуры внутри (названного) союза ведут себя как совпадающие, взаимоисключающие члены союза. Таким образом, следующее должно работать:
union Foo
{
struct
{
char a;
char b;
};
};
int main(void) {
union Foo f;
assert(&f == &(f.a) && &f == &(f.b));
}
Конечно, этого не происходит, и мы не хотим, чтобы это... не было никаких причин для анонимных структур/союзов, если бы они работали, как указано выше. Тем не менее, Стандарт кажется однозначным в этом вопросе. Есть что-то, что мне не хватает?