web-dev-qa-db-fra.com

Comment désactiver les avertissements #pragma?

Lors du développement d'une application C++, j'ai dû utiliser une bibliothèque tierce qui a produit une énorme quantité d'avertissements liés à l'utilisation d'une directive #pragma inoffensive.

../File.hpp:1: warning: ignoring #pragma ident
In file included from ../File2.hpp:47,
                 from ../File3.hpp:57,
                 from File4.h:49,

Est-il possible de désactiver ce type d'avertissements, lors de l'utilisation du compilateur C GNU C++?

46
Marcos Bento

Je pense que vous pouvez compiler avec

-Wno-unknown-pragmas

pour les supprimer.

99
Adam Wright

Dans GCC, compilez avec -Wno-unknown-pragmas

Dans MS Visual Studio 2005 (cette question n'est pas balisée avec gcc, j'ajoute donc ceci pour référence), vous pouvez désactiver globalement dans Paramètres du projet-> C/C++ -> Avancé. Entrez 4068 dans "Désactiver les avertissements spécifiques"

ou vous pouvez l'ajouter à n'importe quel fichier pour désactiver les avertissements localement

#pragma warning (disable : 4068 ) /* disable unknown pragma warnings */
24
Airsource Ltd

Voir peut-être GCC Diagnostic Pragmas ? Dans ce cas, vous pouvez également utiliser la combinaison d'options que -Wall active, à l'exclusion de -Wunknown-pragmas.

18
Mike Dimmick

Merci à tous pour l'astuce. Dans mon cas, je travaille avec Qt Mingw. Je dois définir le drapeau d'une autre manière, dans mon fichier .PRO:

QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas
7
pamplemousse_mk2

Je sais que la question concerne GCC, mais pour les personnes qui souhaitent le faire de manière aussi portable que possible:

La plupart des compilateurs qui peuvent émettre cet avertissement ont un moyen de désactiver l'avertissement à partir de la ligne de commande (exception: PGI) ou du code (exception: DMC):

  • GCC: -Wno-unknown-pragmas/#pragma GCC diagnostic ignored "-Wunknown-pragmas"
  • clang: -Wno-unknown-pragmas/#pragma clang diagnostic ignored "-Wunknown-pragmas"
  • Compilateur Intel C/C++: -diag-disable 161/#pragma warning(disable:161)
  • IGP: #pragma diag_suppress 1675
  • MSVC: -wd4068/#pragma warning(disable:4068)
  • TI: --diag_suppress,-pds=163/#pragma diag_suppress 163
  • Compilateur IAR C/C++: --diag_suppress Pe161/#pragma diag_suppress=Pe161
  • Compilateur numérique Mars C/C++: -w17

Vous pouvez combiner la plupart de cela en une seule macro à utiliser dans votre code, ce que j'ai fait pour la macro HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS dans Hedley :

#if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
#Elif HEDLEY_INTEL_VERSION_CHECK(16,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
#Elif HEDLEY_PGI_VERSION_CHECK(17,10,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
#Elif HEDLEY_GNUC_VERSION_CHECK(4,3,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
#Elif HEDLEY_MSVC_VERSION_CHECK(15,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
#Elif HEDLEY_TI_VERSION_CHECK(8,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
#Elif HEDLEY_IAR_VERSION_CHECK(8,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
#else
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
#endif

Notez que Hedley peut avoir des informations plus complètes que cette réponse car j'oublierai probablement de mettre à jour cette réponse, donc si vous ne voulez pas simplement utiliser Hedley (c'est un seul en-tête C/C++ du domaine public, vous pouvez facilement le déposer dans votre projet ), vous pouvez utiliser Hedley comme guide au lieu des informations ci-dessus.

Les vérifications de version sont probablement trop pessimistes, mais il est parfois difficile d'obtenir de bonnes informations sur les versions obsolètes des compilateurs propriétaires, et je préfère être prudent que désolé. Encore une fois, les informations de Hedley peuvent être meilleures.

De nombreux compilateurs peuvent également envoyer des avertissements push/pop sur une pile, vous pouvez donc pousser, puis les désactiver avant d'inclure du code que vous ne contrôlez pas, puis pop donc votre , le code déclenchera toujours l'avertissement en question (afin que vous puissiez le nettoyer). Il existe également des macros pour cela dans Hedley: HEDLEY_DIAGNOSTIC_Push / HEDLEY_DIAGNOSTIC_POP .

6
nemequ