Il est courant d'utiliser {0}
pour initialiser une struct
ou une 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 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?
En outre: 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
:
a.c: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 du 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.
Selon le standard C99, la création de tableaux avec une liste d'initialisateurs vide est interdite. Dans une réponse précédente, vous pouvez voir que la grammaire ne décrit pas ce cas.
Mais que se passe-t-il si vous déclarez un tableau sans initialisation? Cela dépend du compilateur que vous utilisez. Jetons un coup d'œil à cet exemple simple: int arr[5] = {}
.
GCC
Par défaut, gcc
ne produit aucun avertissements/erreurs lorsque vous essayez de compiler ce code. Pas même -Wall
, mais -Wpedantic
le fait.
warning: ISO C forbids empty initializer braces
Quoi qu'il en soit, gcc
remplit les membres d'un tableau avec 0 exactement comme si vous le spécifiiez explicitement int arr[5] = {0}
voir Assembly output godbolt .
CLANG
Mais par défaut, les avertissements concernant ce cas ne sont pas affichés, mais avec l’option -Wgnu-empty-initializer
:
warning: use of GNU empty initializer extension
Clang génère un code Assembly différent godbolt mais se comporte de la même manière.