Une liste d’initialisation vide est-elle un code C valide?

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.