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 : 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;
}
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 : 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;
}
qui est équivalente à initialiser n avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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")
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
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