Je reçois beaucoup de ces avertissements du code tiers que je ne peux pas modifier. Existe-t-il un moyen de désactiver cet avertissement ou au moins de le désactiver pour certaines zones (comme #pragma push / pop dans VC ++)?
Exemple:
list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after
list.h:1117: warning: `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_'
Réponses:
Assurez-vous que les membres apparaissent dans la liste d'initialisation dans le même ordre qu'ils apparaissent dans la classe
ou vous pouvez tourner
-Wno-reorder
la source
b
et l'a
initialisation peuvent dépendre les uns des autres. Un utilisateur naïf pourrait essayer de modifier l'ordre d'initialisation pour obtenir un certain effet et l'avertissement indiquerait clairement que cela ne fonctionne pas.-Wno-reorder
sans mentionner les problèmes qui pourraient en résulter. Je suis conscient que le PO n'a pas demandé d'autres détails, mais une réponse tellement votée que je m'attendrais à mentionner au moins le contexte et les mises en garde à ce sujet. Ne sommes-nous pas censés répondre à la question que le PO aurait dû écrire?Vous pouvez le désactiver avec
-Wno-reorder
.la source
Pour ceux qui utilisent QT ayant cette erreur, ajoutez ceci au fichier .pro
la source
utiliser
-Wno-reorder
(man gcc est votre ami :))la source
Si vous voyez des erreurs des en-têtes de bibliothèque et que vous utilisez GCC, vous pouvez désactiver les avertissements en incluant les en-têtes à la
-isystem
place de-I
.Des caractéristiques similaires existent dans clang .
Si vous utilisez CMake, vous pouvez spécifier
SYSTEM
pourinclude_directories
.la source
SYSTEM
"?include_directories
ligne.L'ordre d'initialisation n'a pas d'importance. Tous les champs sont initialisés dans l'ordre de leur définition dans leur classe / structure. Mais si l'ordre dans la liste d'initialisation est différent, gcc / g ++ génère cet avertissement. Modifiez uniquement l'ordre d'initialisation pour éviter cet avertissement. Mais vous ne pouvez pas définir le champ using dans l'initialisation avant sa construction. Ce sera une erreur d'exécution. Vous changez donc l'ordre de définition. Soyez prudent et restez attentif!
la source
l'ordre est important car si a est initialisé avant b, et a dépend de b. un comportement indéfini apparaîtra.
la source