Est-il sage d'ignorer gcc/clang s “-Wmissing-accolades” avertissement?
Considérons le programme suivant:
#include <array>
int main()
{
std::array<int, 1> x = { 0 }; //warning!
x = { { 0 } }; //no warning
return 0;
}
De la première initialisation conduit à des mises en garde sur gcc 4.7.2...
main.cpp:5:22: warning: unused variable ‘x’ [-Wunused-variable]
... et clang 3.1
main.cpp:5:28: warning: suggest braces around initialization of subobject [-Wmissing-braces]
std::array<int, 1> x = { 0 };
Aussi loin que le standard va, il devrait y avoir aucune différence entre simple ou double accolades, au moins dans cet exemple.
Il y a deux façons de traiter avec l'avertissement:
- Simplement désactiver
- Corriger le code, de sorte que le compilateur est heureux
Que vous proposez-vous? À mon humble avis, la double bouclés expression semble un peu laid. D'autre part, l'avertissement peut détecter des problèmes réels dans des exemples plus compliqués. Connaissez-vous un exemple où l'avertissement qui vous aurait aidé?
Parce que std::array est un agrégat. Voir [thread][1]. [1]: stackoverflow.com/questions/16341118/...
Juste pour informer: pour désactiver cet avertissement, il faut ajouter -Wno-missing-accolades sur clang
Juste pour informer: pour désactiver cet avertissement, il faut ajouter -Wno-missing-accolades sur clang
OriginalL'auteur Philipp Claßen | 2012-12-16
Vous devez vous connecter pour publier un commentaire.
-Wmissing-accolades
ne plus être activé dans GCCMur
(pour C++) de mode, de 4,8, précisément pour la raison que vous décrivez. Pour les versions actuelles de GCC, de désactiver ou d'ignorer l'avertissement, le code est écrit de la façon dont il devrait être.L'avertissement est sans doute destinée à couvrir le code tel que
Cependant, à mon humble avis, c'est déjà bien assez par
-Wmissing-field-initializers
, qui n'a pas avertir au sujet de votre code d'origine.int x[2][2] = {0}
quand ils devraient avoir écrit{{0}}
.Pourquoi devraient-ils? En C,
{0}
est l'initialiseur, qui fonctionne pour tous les types, et est utilisé de plus que ce qui est strictement nécessaire à cause de cela. Il est parfaitement valide, il est évident ce que cela signifie, alors pourquoi devrait-est de provoquer un avertissement?Clang avertit toujours à propos de cette question, mais a un bug similaire ouvrir, voir llvm.org/bugs/show_bug.cgi?id=21629
Pouvez-vous préciser votre commentaire " initialise b.un.b, ni b.b'. Je veux dire, la déclaration
B b = {1, 2}
initialiseb.a.a
à1
,b.a.b
à2
etb.b
à0
. L'initialisation deb.b
est due à C11, 6.7.9 (21) (c'est à dire '[..], le reste de la somme doit être initialisé implicitement le même que les objets qui ont statique de la durée de stockage.'). Ainsi, dans cet exemple, tout est initialisé.Je voulais dire pour le commentaire à appliquer à la
2
. Est-ce plus clair comme ça?OriginalL'auteur
Je reçois le même message d'avertissement dans Xcode 6.1.1 (la version actuelle en date du 9 Mars 2015). Quand j'ai ajouter un petit accolades autour de chaque sous-objet, j'obtiens une erreur. Quand j'ajoute un ensemble supplémentaire de des accolades autour de l'ensemble de la liste d'initialisation, puis l'avertissement disparaît. Selon la spécification de la norme 14882:2011 23.3.2.1 [tableau.présentation] le paragraphe 2 stipule explicitement
résultat de code dans Xcode 6.1.1 (ci-dessous)
Quand on regarde 14882:2011 8.5 [dcl.init] paragraphe 1, nous voyons que "un initialiseur-liste" peut éventuellement contenir un "initialisation de la clause', qui peut lui-même être un "arc-boutée-init-list'. Donc de toute façon doit être correcte. Bien que basée sur la spécification personnellement, je pense que seul les accolades ne devrait pas émettre un avertissement du compilateur pour un std::array initialiseur-liste et double accolades est exagéré.
OriginalL'auteur Robert Blair Aldridge
Clang 6.0 supprime l'avertissement manque des accolades. Le svn log dit:
Je voudrais donc omettre les accolades et désactiver
-Wmissing-braces
pour Clang avant 6.0 si elle a besoin d'être soutenu.OriginalL'auteur proski
En ignorant le Bruit d'avertissement avec
-Wno-missing-braces
, je vous recommande d'activer-Wmissing-field-initializers
(ou utilisez-Wextra
, qui comprend également). Sinon, vous manquez un avertissement utile, comme dans cet exemple:À des fins de comparaison, c'est ce que GCC n':
En résumé:
-Wno-missing-braces -Wmissing-field-initializers
au silence de l'avertissement sans perdre d'autres avertissements utilesstd::array<int, 1> x = { 0 };
exemple, il n'ya donc pas besoin de désactiver les mises en garde. Cependant, je vous recommande d'activer-Wmissing-field-initializers
(ou utilisez-Wextra
), comme il n'est pas activé par-Wall
.-Wno-missing-braces
avec-Wall
? I. e. "tout sauf pas-manquer-accolades"?Oui, vous pouvez
OriginalL'auteur Philipp Claßen