web-dev-qa-db-fra.com

Désactiver sélectivement les avertissements GCC pour une partie seulement d'une unité de traduction?

Quel est l'équivalent GCC le plus proche de ce code de préprocesseur MSVC?

#pragma warning( Push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

Nous avons du code dans des en-têtes généralement inclus que nous ne voulons pas générer d'avertissement spécifique. Cependant, nous voulons que les fichiers qui incluent ces en-têtes continuent de générer cet avertissement (si le projet a cet avertissement activé).

82
Jon-Eric

C'est possible dans GCC depuis la version 4.6, ou vers juin 2010 dans le tronc.

Voici un exemple:

#pragma GCC diagnostic Push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */
93
Matt Joiner

La chose la plus proche est le pragma de diagnostic GCC , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever". Ce n'est pas très proche de ce que vous voulez, et voyez le lien pour les détails et les mises en garde.

35
chaos

J'ai fait quelque chose de similaire. Pour le code tiers, je ne voulais voir aucun avertissement. Donc, plutôt que de spécifier -I/path/to/libfoo/include, J'ai utilisé -isystem /path/to/libfoo/include. Cela oblige le compilateur à traiter ces fichiers d'en-tête comme des "en-têtes système" aux fins des avertissements, et tant que vous n'activez pas -Wsystem-headers, vous êtes surtout en sécurité. J'ai encore vu quelques avertissements sortir de là, mais cela réduit la plupart des déchets.

Notez que ceci seulement vous aide si vous pouvez isoler le code incriminé par include-directory. Si c'est juste un sous-ensemble de votre propre projet, ou mélangé avec un autre code, vous n'avez pas de chance.

32
Tom

Ceci est une extension de réponse de Matt Joiner .

Si vous ne voulez pas générer de pragmas sur tout votre code, vous pouvez utiliser _ opérateur Pragma :

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_Push _Pragma("GCC diagnostic Push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_Push
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

DIAGNOSTIC_POP
foo(a); // Error
1
Cássio Renan