Il est courant d’utiliser {0}
pour initialiser une struct
ou un array
mais considérons le cas où le premier champ n’est pas un type scalaire. Si le premier champ de struct Person
est une autre struct
ou un autre tableau, cette ligne générera une erreur ( error: missing braces around initializer
).
struct Person person = {0};
Au moins, GCC me permet d’utiliser une liste d’initialiseur vide pour accomplir la même chose
struct Person person = {};
Mais s’agit-il d’un code C valide?
Aussi: cette ligne garantit-elle le même comportement, c’est-à-dire une struct
initialisée à zéro?
struct Person person;
Non, une liste d’initialisation vide n’est pas autorisée. Ceci peut aussi être montré par GCC lors de la compilation avec -std=c99 -pedantic
:
ac:4: warning: ISO C forbids empty initializer braces
La raison en est la façon dont la grammaire est définie au § 6.7.9 de la norme ISO C 2011 :
initializer: assignment-expression { initializer-list } { initializer-list , } initializer-list: designation(opt) initializer initializer-list , designation(opt) initializer
Selon cette définition, une liste d’initialiseurs doit contenir au moins un initialiseur.