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.
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.
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")
^^^^^^
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
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.
#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.
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.
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
Mettre ce qui suit
#pragma GCC system_header
désactivera les avertissements GCC pour tout le code suivant dans ce fichier.