У меня следующий вопрос: как правильно инициализировать анонимные структуры (или объединения) в соответствии с текущим проектом 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, gj == 0
и gb == 3
, а в tcc gj == 3
и gb == 0
. В текущем проекте говорится:
«[...] безымянные члены объектов структуры и типа объединения не участвуют в инициализации. Безымянные члены объектов структуры имеют неопределенное значение даже после инициализации.».
Неужели это правда? Разве
struct foo h = { 0 };
не должен устанавливать для всех участников значение 0?
Большое спасибо!
ОБНОВЛЕНИЕ :
Поскольку анонимные члены кажутся полезными только при смешивании структур / объединений, как правильно инициализировать это:
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 } };
Второй является нарушением стандарта?