Lorsque vous utiliser l'ensemble des initialiseurs (initialiseurs en {}
) dans le "traditionnel" de la norme ANSI du langage C (C89/90), vous devez fournir un individu initialiseur pour chaque structure membre, dans l'ordre, en commençant par le premier. Par exemple
struct S { int a, b, c, d; };
struct S s = { 1, 2, 3, 4 };
/* 1 for `s.a`, 2 for `s.b` and so on... */
Vous n'êtes pas obligé de spécifier les initialiseurs pour tous les membres, c'est à dire que vous pouvez arrêter à tout moment (membres restants seront remis à zéro). Si pour quelque raison vous ne vouliez explicitement initialiser le troisième membre de la structure, vous n'avez pas eu d'autres choix que de fournir un "dummy" explicite de l'initialiseur de la première et de la deuxième membres (juste pour arriver à ce troisième)
/* We only care to explicitly initialize `s.c` */
struct S s = { 0, 0, 3 };
/* and we have no choice but to explicitly initialize `s.a` and `s.b` as well */
La nouvelle spécification de langage C (C99) permet d'utiliser les "tagged" les initialiseurs en fournissant le membre désiré nom au sein de la {}
struct S s = { .c = 3 };
De cette façon, vous ne explicitement initialiser le membre désiré(s) (et de demander au compilateur de façon implicite zéro-initialiser le reste).
Ce n'est pas seulement vous permet d'économiser un peu de temps, mais rend également le total des initialiseurs indépendant de l'ordre dans lequel les membres sont déclarées dans la structure.
Agrégation des initialiseurs, comme vous le savez probablement, peut être utilisé avec les tableaux, trop. Et C99 prend en charge "marqué" initialisation de tableaux ainsi. Comment les "balises" look dans le cas d'un tableau est illustré par l'exemple suivant
int a[10] = { [5] = 3 };
Il est intéressant de noter une fois de plus qu'en langage C qui continue à coller à l' "tout ou rien" approche globale de l'initialisation: si vous spécifiez explicitement un initialiseur pour juste une (ou plusieurs) membres d'une structure ou un tableau, l'ensemble de l'agrégat (struct ou un tableau) est initialisé, et les membres sans autorisation explicite des initialiseurs d'obtenir initialisé à zéro.