2009-10-14 5 views
173

Je reçois beaucoup de ces avertissements de code de tiers que je ne peux pas modifier Y at-il un moyen de désactiver cet avertissement ou au moins le désactiver pour certaines zones (comme #pragma push/pop dans VC++)gcc warning "'sera initialisé après'

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_' 
+0

Pouvez-vous s'il vous plaît poster quelques lignes des avertissements réels? Et dites aussi si c'est C, C++, et si vous avez la source, si l'avertissement vient de l'éditeur de liens ou du processus de compilation? – csl

Répondre

277

Assurez-vous que les membres apparaissent dans la liste des initialiseur dans le même ordre que dans la classe

Class C { 
    int a; 
    int b; 
    C():b(1),a(2){} //warning, should be C():a(2),b(1) 
} 

ou vous pouvez activer -Wno-reorder

+10

OP ne peut pas modifier le code. –

+64

Pourquoi est-ce important? Pourquoi cet avertissement existe-t-il? – Eloff

+30

@Eloff Dans certains cas (non recommandables), l'initialisation 'b' et' a' peut dépendre l'une de l'autre. Un utilisateur naïf pourrait essayer de modifier l'ordre d'initialisation pour obtenir un effet et l'avertissement indiquerait clairement que cela ne fonctionne pas. – Gorpik

28

Vous pouvez le désactiver avec -Wno-reorder

7

utilisation -Wno-reorder (homme gcc est votre ami :))

+5

Wow, vous avez trouvé une nouvelle façon de dire RT_M: MIYF (l'homme est votre ami) Si cela ne vous dérange pas, je vais l'utiliser :) –

12

Pour ceux qui utilisent QT ayant cette erreur, ajoutez à. fichier pro

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder 
1

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/struct. Mais si l'ordre dans la liste d'initialisation est différent, gcc/g ++ génère cet avertissement. Changez seulement l'ordre d'initialisation pour éviter cet avertissement. Mais vous ne pouvez pas définir de champ en utilisant l'initialisation avant sa construction. Ce sera une erreur d'exécution. Donc vous changez l'ordre de définition. Soyez prudent et gardez l'attention!

+0

L'OP voulait savoir comment désactiver l'avertissement, pas ce que cela signifie ou comment réparer le code. En fait, le message dit que le code est une tierce partie et ne peut pas être modifié. Ils ne peuvent pas non plus changer l'ordre de définition et probablement pas l'ordre d'initialisation. –

+0

cela fait beaucoup ** d'importance ** si le 2ème objet de la liste init est initd du 1er objet, mais ils sont déclarés à l'envers dans l'en-tête. dans ce cas, les choses pourraient devenir très bizarres. –

4

Si des erreurs se produisent dans les en-têtes de bibliothèque et que vous utilisez GCC, vous pouvez désactiver les avertissements en incluant les en-têtes à l'aide de -isystem au lieu de -I. Les caractéristiques similaires existent dans clang. Si vous utilisez CMake, vous pouvez spécifier SYSTEM pour include_directories.

+0

Pouvez-vous expliquer comment "spécifier' SYSTEM' "? – einpoklum

+1

Mettez simplement la chaîne 'SYSTEM' à la fin de la ligne' include_directories'. –

Questions connexes