web-dev-qa-db-fra.com

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

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;
29
Marcus Ahlberg

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.

37
interjay

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.

1
FUNNYDMAN