f
и h
должны правильно инициализировать всех членов, поскольку i
и j
должны рассматриваться как члены struct foo
(C1x 6.7.2.1 §13):
Члены анонимной структуры или объединения считаются членами содержащей структуры или объединения.
Я не думаю, что инициализация gcc для g
правильна, учитывая C1x 6.7.9 §9:
За исключением случаев, когда явно указано иное, для целей настоящего подпункта неназванные члены объектов структуры и типа объединения не участвуют в инициализации.
§20, которая имеет дело с субагрегатами, не содержит явного утверждения, относящегося к данной проблеме, поэтому я думаю, что § 9 применяется (но только к самому агрегату, , а не к его членам!).
Суть в том, что анонимные субагрегаты не существуют как отдельные объекты, то есть поведение tcc должно быть правильным ...
Пример кода для моего подхода к проблеме:
struct foo
{
struct bar { int i; }; // (1) unnamed, but tagged, ie *not* anonymous
struct { int j; }; // (2) unnamed, but anonymous
struct { int k; } baz; // (3) named, but not tagged
};
(1) не принимает участия в инициализации, (2) инициализирует, как если бы struct foo
имел дополнительный член с именем j
, (3) инициализируется как обычный субагрегат.
Если моя интерпретацияверно, анонимные структуры имеют смысл только в том случае, если они содержатся внутри объединения: анонимная структура в структуре неотличима от плоской структуры, содержащей дополнительные элементы.