Comment faire pour supprimer l'avertissement dans gcc 4.6: manque d'initialiseur [-Wmissing-champ-des initialiseurs]?
Le code:
GValue value = { 0 };
Donner l'avertissement suivant:
manque d'initialiseur [-Wmissing-champ-des initialiseurs]
Je sais que c'est un gcc BUG
; mais est-il une astuce pour l'enlever? vraiment pas agréable de voir une telle irréel avertissements. Mais je ne veux pas éteindre l'avertissement, car il sera caché réel avertissements de moi aussi. A désolé, mais je ne peux pas mettre à jour mon gcc 4.7(où on dirait que c'est fixe) de la version, encore.
Je doute fortement que c'est un bug de gcc. Pourriez-vous nous montrer la définition de la structure de GValue.
c'est juste un exemple; je suis à la recherche d'une solution qui fonctionne pour tout struct.
Je pense que nous pouvons supposer que c'est un GLib GValue — ce qui signifie qu'il a plus d'un membre (et en effet, ce qui vaut la peine struct ne pas avoir plus d'un membre?)
indépendant de la façon dont de nombreux membres de la structure ont, en utilisant
Il n'y a pas de bug. Selon la norme, une mise en œuvre conforme peut émettre des messages de diagnostic pour quelque raison que ce soit, y compris des raisons esthétiques, tant qu'il accepte toujours valide les programmes (c'est à dire c'est un avertissement et non une erreur). Vous pouvez désactiver cet avertissement spécifique.
c'est juste un exemple; je suis à la recherche d'une solution qui fonctionne pour tout struct.
Je pense que nous pouvons supposer que c'est un GLib GValue — ce qui signifie qu'il a plus d'un membre (et en effet, ce qui vaut la peine struct ne pas avoir plus d'un membre?)
indépendant de la façon dont de nombreux membres de la structure ont, en utilisant
{0}
tous les membres doivent être à 0
. Il est décrit dans la norme C, comme vous pouvez le voir dans le lien dans mon post.Il n'y a pas de bug. Selon la norme, une mise en œuvre conforme peut émettre des messages de diagnostic pour quelque raison que ce soit, y compris des raisons esthétiques, tant qu'il accepte toujours valide les programmes (c'est à dire c'est un avertissement et non une erreur). Vous pouvez désactiver cet avertissement spécifique.
OriginalL'auteur Jack | 2012-11-14
Vous devez vous connecter pour publier un commentaire.
Utilisation
G_VALUE_INIT
pour initialiserGValue
-s. Leur (privé) de la structure est en/usr/include/glib-2.0/gobject/gvalue.h
qui#define G_VALUE_INIT
de façon appropriée.Pas du tout d'accord avec votre évaluation que c'est GCC bug. Vous avez demandé à être averti si un champ n'est pas explicitement initialisée avec
-Wmissing-field-initializers
et vous obtenez l'avertissement que vous méritez.Malheureusement
G_VALUE_INIT
n'est pas documenté, mais il est ici. Code avecIl n'y a pas de solution universelle pour ne jamais obtenir l'avertissement sur le champ manquant d'initialisation si
-Wmissing-field-initializers
est demandé. Lorsque vous demandez à un tel avertissement, vous avez besoin du compilateur pour avertir de tous les incomplète des initialiseurs. En effet, la norme exige que tous les non-explicitement initialiséestruct
champs être remis à zéro etgcc
obéit à la norme.Vous pouvez utiliser diagnostic pragmas comme
Mais mon sentiment est que vous devriez code avec soin, et explicitement initialiser tous les champs. L'avertissement que vous obtenez est plus un style de codage d'avertissement (peut-être que vous avez oublié un champ!) que d'un bug d'avertissement.
Je crois aussi que pour votre propre (public)
struct
vous devriez#define
une initialisation de la macro, si de tellesstruct
sont destinés à être initialisé.Mais il est un bug.
{0}
est ce qu'on appelle l ' "universel zéro de l'initialiseur", et quand on l'utilise, on est explicitement l'initialisation de tous les champs de zéro logique. Ainsi, elle n'a pas de sens pour GCC (ou Clang, ou tout autre compilateur) pour émettre une telle mise en garde sur de tels cas.Vieux post, mais votre affirmation n'est pas correcte. Le langage C n' pas traiter
{0}
comme un cas spécial. Il n'y a pas une telle chose comme un "universel zéro de l'initialiseur" ni{0}
un moyen d'initialiser explicitement l'ensemble de la baie/struct.{0}
signifie simplement: initialiser le premier élément à zéro, puis de les laisser tous les autres membres de l'initialisation, comme s'ils avaient statique de la durée de stockage, ce qui est fait implicitement. Et c'est pourquoi{1}
initialise seulement le premier élément 1 et le reste à zéro, il fonctionne exactement de la même.en effet,
{0}
n'est pas "universel zéro de l'initialiseur", mais{}
EST l ' "universel initialiseur", qui sera, par la norme, toujours de remplissage d'une structure à 0 pour les champs ayant pas défini par l'utilisateur initializers/pas de constructeur. Cette langue est souvent utilisé parce que 0 est ce que le programmeur veut en général. Plusieurs fois, il est utilisé avec les structures C avec (évidemment) pas d'initialiseur, et sans la possibilité d'en ajouter de nouvelles. L'avertissement est une (très ennuyeux) GCC bug. Pourquoi l'ajout ajout non nécessaire, non utile contraintes qui empêche le programmeur de la réalité des choses ?Vous pouvez utiliser
{0,}
(notez la virgule) pour initialiser tous les champs à zéro, mais il va s'étouffer sur certains struct mises en page. C'est aussi près que C obtient un " universel zéro initialiser’. Si vous vraiment vous voulez un universel initialiser à zéro, utilisezmemset()
sur la structure de l'instance.OriginalL'auteur Basile Starynkevitch
Vous pouvez utiliser:
pour empêcher que d'avertissement en particulier. À l'inverse, vous pourriez faire une erreur avec:
À la fois de ces travaux avec GCC 4.7.1; je crois qu'ils travaillent avec GCC 4.6.x aussi, mais ils ne fonctionnent pas avec toutes les versions antérieures de GCC (GCC 4.1.2 reconnaît
-Wno-missing-field-initializers
mais pas-Werror=missing-field-intializers
).Évidemment, l'autre façon de supprimer l'avertissement est d'initialiser tous les champs explicitement. Ce peut être douloureux, mais.
OriginalL'auteur Jonathan Leffler
Il apparaît également que l'utilisation de l' .champ-le style de l'initialisation, tels que:
entraîne le compilateur pour ne pas émettre de l'avertissement. Malheureusement, si la structure est opaque, c'est un non-starter.
OriginalL'auteur John Hascall