Comment supprimer les Avertissements GCC des en-têtes de bibliothèque?

j'ai un projet qui utilise log4cxx, boost, etc. les bibliothèques dont les en-têtes génèrent beaucoup d'Avertissements (répétitifs). Y a-t-il un moyen de supprimer les avertissements de la bibliothèque includes (i.e. #include ) ou inclut de certains chemins? J'aimerais utiliser-Wall et / ou-Wextra comme d'habitude sur le code de projet sans que les informations pertinentes soient masquées. J'utilise actuellement grep sur la sortie make mais je voudrais quelque chose de mieux.

101
demandé sur AdSR 2009-12-08 16:43:40

8 réponses

vous pouvez essayer d'inclure les en-têtes de bibliothèque en utilisant -isystem au lieu de -I . Cela fera d'eux des "en-têtes de système" et GCC ne signalera pas d'avertissements pour eux.

101
répondu Phi 2011-09-19 13:56:47

pour ceux qui utilisent CMake, vous pouvez modifier vos directives include_directories pour inclure le symbole SYSTEM qui supprime les avertissements contre de tels en-têtes.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
78
répondu Drew Noakes 2014-10-10 10:54:47

vous pouvez utiliser pragmas. Par exemple:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop
40
répondu andrewrjones 2014-04-06 17:16:55

j'ai trouvé le truc. Pour la bibliothèque inclut, au lieu de - Idir utiliser - iSystem dir dans le makefile. GCC traite ensuite boost etc. comme le système inclut et ignore tous les avertissements de leur part.

23
répondu AdSR 2009-12-14 10:39:34

#pragma sont des instructions au compilateur. vous pouvez définir quelque chose avant le #include et le désactiver après.

vous pouvez également le faire à la ligne de commande .

un Autre GCC page du désactivation des avertissements .

j'opterais pour l'option d'utiliser # pragma dans le code source, et puis fournir un son raison (comme un commentaire) pourquoi vous désactivez les Avertissements. Cela signifierait raisonner au sujet des fichiers headers.

GCC s'approche de cela par classant les types d'avertissement. Vous pouvez les classer comme des avertissements ou être ignorés. Les articles liés précédemment vous indiqueront quels avertissements sont susceptibles d'être désactivés.

Note: Vous pouvez également masser le code source pour prévenir certains avertissements en utilisant attributs ; toutefois, ce lien vous êtes très proche de GCC.

Note 2: GCC utilise également pop/push interface comme utilisé dans le compilateur de microsoft -- Microsoft désactive les Avertissements par cette interface. Je vous suggère d'approfondir cette question , car je ne sais même pas si c'est possible.

8
répondu Hassan Syed 2009-12-08 15:00:33

vous pouvez essayer d'utiliser headers précompilés . Les avertissements ne disparaîtront pas, mais au moins ils n'apparaîtront pas dans votre compilation principale.

4
répondu Pablo Santa Cruz 2009-12-08 13:46:05

si vous avez besoin de modifier explicitement un en-tête de système, alors vous êtes limité à pragmas. Vous pouvez vérifier quels sont les inclusions que vous utilisez via la sortie make depend .

Voir aussi pression de diagnostic pour gcc > = 4,6

0
répondu supaflav 2017-05-23 12:34:48

il doit y avoir des raisons pour ces avertissements. Ces va être causés par des erreurs dans votre code qui utilise la bibliothèque, ou par des erreurs dans le code de la bibliothèque elle-même. Dans le premier cas, corrigez votre code. Dans le second cas, soit arrêter d'utiliser la bibliothèque ou si c'est le code FOSS, le corriger.

-6
répondu 2009-12-08 13:48:43