Pourquoi le compilateur de lancer cet avertissement: “manque d'initialiseur”? N'est-ce pas la structure initialisée?
Je suis de la création d'une sorte de page de garde pour un programme. Pour lancer le programme que je suis en utilisant l'appel CreateProcess()
, qui, entre autres choses reçoit un pointeur vers une STARTUPINFO
structure. Pour initialiser la structure que j'ai utilisé pour le faire:
STARTUPINFO startupInfo = {0}; //Or even 'STARTUPINFO startupInfo = {0}; //Or even '\0'.
startupInfo.cb = sizeof(startupInfo);
'.
startupInfo.cb = sizeof(startupInfo);
Lors de la compilation du programme avec GCC, l'activation de ces ensembles de mises en garde -Wall -Wextra
il me donne un message d'avertissement disant qu'il y a un manque d'initialiseur pointant vers la première ligne.
warning: missing initializer
warning: (near initialization for 'startupInfo.lpReserved')
J'ai donc fini par le faire:
STARTUPINFO startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
Et de cette façon, le compilateur ne donne pas d'avertissement.
La question est, quelle est la différence entre ces façons de l'initialisation d'une structure?
À l'aide de la première méthode, n'est-ce pas la structure initialisée?
Qu'on vous recommande?
- Il ne veut pas me donner un avertissement à l'aide de VC2008 /W4
- Oui, merci, ici aussi. Au moins GCC 4.4.1 et 4.5.0 donner cet avertissement, il peut être à cause du rembourrage que vous mentionnez.
- L'avertissement est juste que: un avertissement. C'est ok pour ignorer cet avertissement spécifique à cette occasion spécifique. Le compilateur émet l'avertissement pour vous aider dans des cas comme:
struct struct_with_four_fields x = {1, 2, 3};
où seuls 3 des 4 membres sont initialisées. - Dans mon commentaire précédent le 4ème membre est initialisé à 0.
- Alerte sur le manque de initialiseurs n'est pas déraisonnable en général; si vous avez une structure avec 4 membres et de vous fournir des initialiseurs pour seulement 3 d'entre eux, c'est probablement une erreur. Mais
{ 0 }
est d'un commun bien défini idiome pour l'initialisation de tous les membres à zéro (définie de manière récursive pour chaque sous-membre) - qui est pourquoi, plus tard, des versions de gcc ont été modifiés de ne pas avertir à propos de ce cas particulier. - qu'est-ce que tu parles? je suis en utilisant gcc 4.8.2, et puisque la question cinq ans ont passé. P. S. il n'y a plus de courrier, qui, j'en suis voulu le lien en fin de compte, mais à ma demande qu'elle est manquante. Probablement serveur de messagerie de ne pas enregistrer tous les messages, c'est triste, le courrier serait utile à celui qui répondent à nouveau le problème.
- Je ne comprends pas ce que vous demandez.
- vous avez dit que ce bug a été corrigé. J'ai juste montré que ce n'est pas vrai.
- Quand je compile un petit programme avec gcc 4.8.1 sur Solaris, j'obtiens un "avertissement: manque d'initialiseur". Quand je compile le même programme avec gcc 4.8.2 sur Linux Mint, je ne suis pas un avertissement. D'ailleurs, la ligne
obj = {0};
dans le message lié à l' n'est pas valide en C, et gcc 4.8.2 la rejette comme une erreur de syntaxe. Si vous êtes à la compilation en C++, n'oubliez pas que c'est une langue différente, et gcc utilise un autre front-end; des corrections dans le gcc est le compilateur C peut ou peut ne pas s'appliquer à g++.
Vous devez vous connecter pour publier un commentaire.
GCC est juste d'être trop paranoïaque pour aucune bonne raison à mon avis, mais il est certainement vrai que la GCC responsables d'en apprendre beaucoup plus sur les nuances de C ce que je fais.
Voir ce petit fil de discussion sur le problème de la GCC liste de diffusion:
Bas de ligne - l'initialisation de la structure avec juste
{0}
sera en fait zéro initialiser l'ensemble de la chose.Le standard C99 dit ce qui suit dans 6.7.8/21 "Initialisation - Sematics":
C90 dit esentially la même dans 6.5.7 avec un peu différentes formulations (en d'autres termes, C99 n'ai pas ajouter quelque chose de nouveau ici).
Également noter qu'en C++, cela a été élargie de manière à ce qu'un ensemble vide de croisillons, "
{}
", permettrait de réaliser la valeur d'initialisation sur un objet, car il y a des situations (comme les modèles) lorsque vous ne savez même pas ce que les membres ou combien de membres d'un type peut avoir. Ainsi, non seulement est-il une bonne pratique, mais nécessaire à la fois d'avoir un initialiseur liste est plus courte que le nombre de membres d'un objet pourrait avoir.{}
) qui est une extension du langage C.-Wno-missing-field-initializers
et-Wno-missing-braces
de sorte que GGC cessé de gémir sur moi de mettre= {0};
pour mes structures. Personne ne sait si la désactivation de ces avertissement va manquer les mises en garde pour d'autres choses autres que= {0};
pour les structures?{0}
:-Wno-missing-field_initializers
permettra d'éviter un avertissement généré si vous commencez à l'init d'un struct, mais n'ont pas explicite les initialiseurs pour tous les champs.-Wno-missing-braces
supprimer un message d'avertissement si vous initialisation d'une structure qui est imbriqué struct sous-objet, mais de ne pas " nid " de la sous-objet init dans des accolades. Je pense qu'il serait légitime que des personnes mises en garde dans ces situations, mais pas pour{0}
. C'est dommage que GCC ne pas faire une exception pour le{0}
idiome (même si elle devait être activé avec une option).mingw32-g++.exe (GCC) 4.7.2
et d'avoir cet avertissement sur l'idiome ci-dessus (même le cas précis deSTARTUPINFO
).{}
ou{0}
initialiseurs dans mes classes C++: /Cela peut être facilement corrigé pour GCC dans les programmes C++ par l'initialisation de la structure de
Vous a demandé de nombreux avertissements que possible à l'aide de
-Wall-Wextra.
Dans ce cas, vous obtenez un avertissement qui vous dit que vous ne spécifiez pas tous les domaines, ce qui est parfaitement valide, mais qui peut avoir été involontaire.
Vous pouvez supprimer cette alerte en ajoutant
-Wno-missing-champ-des initialiseurs
Cette page web traite de la question sous-jacente dans le détail:
http://ex-parrot.com/~chris/random/initialise.html
Pour contourner ce problème, ma solution actuelle est de supprimer sélectivement cet avertissement:
Malheureusement, cela ne fonctionne que dans clang et ne semble pas fonctionner dans GCC.
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
accepté par le compilateur GCC 4.2.1 mais ne rien faire. des doutes sur les nouvelles versions de gcc#pragma clang diagnostic ignored "-Wmissing-field-initializers"
. Vous devriez probablement vérifier si c'est le cas.En C++, vous pouvez utiliser
boost::initialized_value
pour se débarrasser de cet avertissement. J'ai avertissements désactivée pourboost
; donc je ne sais pas si ce serait la cause des autres mises en garde dans votre cas. De cette façon, vous n'avez pas à désactiver l'avertissement.Exemple: