web-dev-qa-db-fra.com

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

J'ai un projet qui utilise des bibliothèques log4cxx, boost, etc. dont les en-têtes génèrent de nombreux avertissements (répétitifs). Existe-t-il un moyen de supprimer les avertissements des inclusions de bibliothèque (c'est-à-dire #include <some-header.h>) ou des inclus de certains chemins? Je voudrais utiliser -Wall et/ou -Wextra comme d'habitude sur le code du projet sans que les informations pertinentes soient masquées. J'utilise actuellement grep sur make output mais j'aimerais quelque chose de mieux.

114
AdSR

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

116
Phi

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

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
92
Drew Noakes

Vous pouvez utiliser des 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
48
andrewrjones

J'ai trouvé l'astuce. Pour les bibliothèques, au lieu de -Idir utilisation -isystem dir dans le makefile. GCC traite ensuite le boost etc. lorsque le système inclut et ignore tous les avertissements de leur part.

25
AdSR

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

Vous pouvez également le faire sur la ligne de commande .

Une autre page GCC spécifiquement sur désactivation des avertissements .

Je choisirais d'utiliser # pragma dans le code source, puis de fournir un son raison (en tant que commentaire) de la raison pour laquelle vous désactivez le avertissements. Cela signifierait un raisonnement sur les fichiers d'en-têtes.

GCC aborde cela en classifiant les types d'avertissement. Vous pouvez les classer comme des avertissements ou pour être ignorés. Les articles liés précédemment vous montreront quels avertissements peuvent être désactivés.

Remarque: vous pouvez également masser le code source pour éviter certains avertissements en utilisant attributs ; cependant, cela vous lie assez étroitement à GCC.

Remarque 2: GCC utilise également interface pop/push tel qu'utilisé dans le compilateur de Microsoft - Microsoft désactive les avertissements via cette interface. Je vous suggère d'enquêter davantage, car je ne sais pas si c'est même possible.

8
Hassan Syed

Vous pouvez essayer d'utiliser en-têtes précompilés . Les avertissements ne disparaîtront pas, mais au moins ils n'apparaîtront pas dans votre compilation principale.

4
Pablo Santa Cruz

Si vous devez remplacer explicitement un en-tête système, vous êtes limité aux pragmas. Vous pouvez vérifier les inclusions que vous utilisez via make depend sortie.

Voir aussi Push-pop de diagnostic pour gcc> = 4.6

1
supaflav

Mettre ce qui suit

#pragma GCC system_header

désactivera les avertissements GCC pour tout le code suivant dans ce fichier.

0
Evgenii