У меня возникает следующий вопрос: как правильно инициализируются анонимные структуры (или союзы) в соответствии с текущим проектом C1X? Является ли это законным:
struct foo {
int a;
struct {
int i;
int j;
};
int b;
};
struct foo f = { 1, 2, 3, 4 };
struct foo g = { 1, { 2 }, 3 };
В GCC, g.j == 0
и g.b == 3
, а в tcc g.j == 3
и g.b == 0
. В текущем проекте говорится:
"[...] неназванные члены объектов структуры и типа объединения не участвуют в инициализации. Члены-члены объектов структуры имеют неопределенное значение даже после инициализации.".
Неужели это действительно так? Не
struct foo h = { 0 };
предполагается установить всех участников в 0?
Большое спасибо!
UPDATE
Поскольку анонимные члены кажутся полезными только при смешивании структур/объединений, как правильно инициализировать это:
struct bar {
int tag;
union {
double d;
int i;
};
};
? Это дает ошибки в gcc < 4.6 и icc 11, но работает в gcc 4.6, icc 12, clang и tcc:
struct bar a = { .tag = 1, .i = 42 };
Это дает ошибки в clang и tcc, но работает в gcc и icc:
struct bar b = { .tag = 1, { .i = 42 } };
Является ли второе нарушением стандарта?