Bonjour,
Il s'agit d'un problème de Warning obtenu avec gcc.
Soit la structure et le programme exemple suivant (programme qui ne fait rien d'autre que d'initialiser la structure):
Cette technique a le désavantage d'initialiser tous les bits de la structure à 0, ce qui n'est pas portable au moins dans le cas où on a un champ de type double (la norme ne garantit pas que 0.0 soit représenté all-bytes-to-zero) ou un champ de type pointeur (NULL n'est pas garantit d'être représenté all-bytes-to-zero).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdlib.h> #include <string.h> struct Noeud { char nom[20]; double valeur; struct Noeud *suiv; }; int main(void) { struct Noeud n; memset(&n, 0, sizeof n); return EXIT_SUCCESS; }
J'utilise donc la technique suivante, beaucoup utilisée notamment dans la bibliothèque clib d'Emmanuel Delahaye:
qui est équivalente à initialiser n avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdlib.h> struct Noeud { char nom[20]; double valeur; struct Noeud *suiv; }; int main(void) { struct Noeud n = {0}; /* avoids warning for unused variable */ (void) n; return EXIT_SUCCESS; }
Mon problème est que les options -Wall -Wextra de gcc activent les options -Wmissing-braces (activée par -Wall) et -Wmissing-field-initializers (activée par -Wextra) qui entraînent les Warnings suivants:
Code : Sélectionner tout - Visualiser dans une fenêtre à part struct Noeud n = {{0}, 0.0, NULL};
Cette technique est bien pratique et je l'utilise très souvent, par exemple dans le contexte suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 test.c: In function «main": test.c:11: attention : accolades manquantes autour de l'initialisation test.c:11: attention : (near initialization for «n.nom") test.c:11: attention : initialisation manquante test.c:11: attention : (near initialization for «n.valeur")
La présence de ces warnings me dérrangent beaucoup, et il m'arrive de les déactiver via les options -Wno-missing-braces, -Wno-missing-field-initializers. Mais je peine à être d'accord avec le principe de désactiver des avertissements.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 struct Noeud *p_self = NULL p_self = malloc(sizeof *p_self); if (p_self != NULL) { static struct Noeud tmp = {0}; *p_self = tmp; /* Suite du code... */ }
Que me conseillez-vous de faire? Comment avez-vous l'habitude de pratiquer? Voyez-vous un problème que pourrait engendrer la déactivation des options mentionnées ci-dessus? Est-ce recommandable? La seule pratique portable est-elle d'initialiser de manière explicite tous les champs de la structure?
Votre avis à ce sujet m'intéresse. Meilleures salutations
Thierry
Partager