Initialisation portable d'une structure
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):
Code:
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;
} |
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).
J'utilise donc la technique suivante, beaucoup utilisée notamment dans la bibliothèque clib d'Emmanuel Delahaye:
Code:
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;
} |
qui est équivalente à initialiser n avec:
Code:
struct Noeud n = {{0}, 0.0, NULL};
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:
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") |
Cette technique est bien pratique et je l'utilise très souvent, par exemple dans le contexte suivant:
Code:
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... */
} |
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.
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