инициализация анонимных структур или объединений в C1X

У меня следующий вопрос: как правильно инициализировать анонимные структуры (или объединения) в соответствии с текущим проектом 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 } };

Второй является нарушением стандарта?

19
задан Johan Bezem 5 January 2012 в 07:13
поделиться