Initialisateurs désignés et éléments omis

Quelqu’un peut-il s’il vous plaît expliquer la ligne suivante sur les initialiseurs désignés:

La liste d’initialisation peut omettre des éléments déclarés n’importe où dans l’agrégat, plutôt qu’à la fin.

Essayez ce lien .

L’idée est de pouvoir faire référence à des membres d’un type complexe comme une structure lors de l’initialisation. Par exemple

struct s { int a, b; }; int main() { struct s = { .b = 42, .a = -42 }; return 0; } 

La flexibilité est gagnée par le fait d’être indépendant de l’ordre lors de la spécification des valeurs. N’oubliez pas que cela a été ajouté à la norme C99 et peut ne pas être pris en charge par des compilateurs ne prenant pas totalement en charge C99 (ou une version antérieure de la norme).

Si vous utilisez une liste d’initialiseurs conventionnelle, les valeurs des éléments sont affectées dans l’ordre, donc si vous avez cette structure:

 typedef struct _foo { int a; int b; } foo_t; 

alors cet initialiseur atsortingbue explicitement a et non b :

 foo_t value = { 7 }; 

sans initialiseurs désignés, les seuls éléments pouvant être omis sont ceux déclarés à la fin

En utilisant des initialiseurs désignés, vous pouvez omettre des éléments déclarés n’importe où:

 foo_t value = { .b = 8 }; 

donc l’initialiseur de value.a est omis, bien qu’il soit la première valeur de la structure.