Инициализация вложенных структур без определения всех полей - PullRequest
2 голосов
/ 29 января 2010

У меня есть набор структур, определенных следующим образом:

typedef struct
{
    int index;
    int array[10];
}
Item;

typedef struct
{
    Item A;
    Item B;
    Item C;
}
Collection;

И я хочу объявить переменную типа Collection следующим образом:

Collection collection =
{
    { 1, 0 },  /* item A */
    { 2, 0 },  /* item B */
    { 3, 0 }   /* item C */
};

Будет ли это устанавливать для трех index переменных значение 1, 2 и 3, одновременно инициализируя все три array[] переменных нулем?

Кажется, он работает на моем компиляторе, но я хотел бы знать, является ли это стандартным поведением.

Ответы [ 2 ]

7 голосов
/ 29 января 2010

Должны быть дополнительные скобки вокруг нулей, чтобы сделать их действительными инициализаторами массива:

Collection collection =
{
    { 1, {0} },  /* item A */
    { 2, {0} },  /* item B */
    { 3, {0} }   /* item C */
};

Кроме того, он правильно инициализирует структуру.

Инициализатор также действителен без дополнительных фигурных скобок, но вы получите предупреждения компилятора, и это гораздо менее запутанно, если инициализаторы для субагрегатов будут сделаны явными. Подробности см. В разделе 6.7.8 в стандарте C99, на который прямо ссылается его ответ, особенно на 6.7.8 (20) и примеры в 6.7.8 (29).

4 голосов
/ 29 января 2010

Это соответствует стандартам. Смотрите раздел - 6.7.8. Инициализация. Кроме того, вы можете использовать указанные инициализаторы в соответствующих компиляторах C99.

...