2010-01-29 4 views
2

j'ai un ensemble de struct, définis comme suit:Initialiser structures imbriquées sans définir tous les champs

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

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

Et je veux déclarer une variable de type Collection comme suit:

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

Est-ce que ce définir les trois variables index sur 1, 2 et 3, tout en initialisant les trois variables array[] avec zéro?

Il semble fonctionner sur mon compilateur, mais j'aimerais savoir si c'est le comportement standard.

Répondre

4

Ceci est conforme aux normes. Voir la section - 6.7.8 Initialisation. En outre, vous pouvez utiliser des initialiseurs désignés dans les compilateurs conformes C99.

+0

C'est plutôt cool. Je n'avais jamais entendu parler des initialiseurs désignés jusqu'à aujourd'hui! –

7

Il devrait y avoir des accolades supplémentaires autour des zéros pour les rendre valides initialiseurs de tableau:

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

En dehors de cela il initialiser correctement la structure. L'initialiseur est également valide sans les accolades supplémentaires, mais vous obtiendrez des avertissements du compilateur et il est beaucoup moins déroutant si les initialiseurs pour les sous-agrégats sont rendus explicites. Pour les détails, voir la section 6.7.8 de la norme C99 à laquelle il fait explicitement référence dans sa réponse, en particulier 6.7.8 (20) et les exemples du 6.7.8 (29).

+0

Observation absolument valable, bien qu'elle ne réponde guère à la question. +1 de toute façon – qrdl

+1

+1. Je pense que même sans les accolades nous avons ce qui est connu comme "une initialisation incomplètement mais uniformément". – dirkgently

+0

@qrdl: J'ai lu la question "est-ce que c'est comme ça?", Mais vous avez raison, j'ai ajouté une autre ligne indiquant clairement qu'elle initialisera la structure correctement. – sth

Questions connexes