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++.

InformationsquelleAutor Shantia | 2009-10-08