web-dev-qa-db-fra.com

Est-ce que l'utilisation de l'avertissement #pragma Push / pop est la bonne façon de modifier temporairement le niveau d'avertissement?

De temps en temps, il est difficile d'écrire du code C++ qui n'émettrait aucun avertissement. L'activation des avertissements est cependant une bonne idée. Il est donc souvent nécessaire de désactiver les avertissements autour de certaines constructions spécifiques et de les activer dans tous les autres morceaux de code.

J'ai vu deux façons de le faire jusqu'à présent.

La première consiste à utiliser #pragma warning( Push ) et #pragma warning( pop ):

 #pragma warning( Push )
 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

La seconde consiste à utiliser #pragma warning( default ):

 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( default: ThatWarning )

Le problème que je vois dans la deuxième variante est qu'il rejette le niveau d'avertissement d'origine - l'avertissement peut avoir été désactivé avant cela ou son niveau d'avertissement peut avoir été modifié. L'utilisation de default annulerait ces modifications.

La première approche semble propre. Y a-t-il des problèmes avec cela? Y a-t-il de meilleures façons de faire la même chose?

66
sharptooth

La première méthode est la meilleure façon de le faire, l'OMI. Je ne connais aucun problème avec ça.

Gardez simplement à l'esprit qu'un #pragma est spécifique au compilateur, alors ne vous attendez pas à ce qu'il fonctionne sur tous les compilateurs :)

34
Goz

Cela fonctionnera avec plusieurs compilateurs (et différentes versions de compilateurs).

En-tête "Push"

#if defined(__clang__)
# pragma clang diagnostic Push
#endif

#if defined(_MSC_VER)
# pragma warning(Push)
#endif

#if defined(YOUR_FAVORITE_COMPILER)
# pragma your compiler Push warning
#endif

En-tête "pop"

#if defined(__clang__)
# pragma clang diagnostic pop
#endif

#if defined(_MSC_VER)
# pragma warning(pop)
#endif

Un avertissement

#if defined(__clang__)
# pragma clang diagnostic ignored "-Wunused-parameter"
# pragma clang diagnostic ignored "-Wunused-variable"
#  if __has_warning("-Wnew-special-warning")
#   pragma clang diagnostic ignored "-Wnew-special-warning"
#  endif
#endif

#if defined(_MSC_VER)
# pragma warning(disable: 4100) // unreferenced formal parameter
# if _MSC_VER > _MSC_SOME_VERSION
#  pragma warning(disable: xxxx) // disable one more for special version
# endif
#endif

Usage

// This code reports warnings
// ...
#include <ignore_compiler_warning/Push>
#include <ignore_compiler_warning/warning_type_1>
#include <ignore_compiler_warning/warning_type_2>
#include <ignore_compiler_warning/warning_type_3>
// This code ignores warnings type_{1,2,3}
// ...
#include <ignore_compiler_warning/pop>
// Back to reporting warnings
// ...

De plus, les gardes peuvent vérifier qu'il n'y a pas de double pragmas Push/pop/disable-warning.

Mise à jour

40
user2288008

Trop tard pour les dents pointues mais pour tous les googleurs:

#pragma warning ( suppress: ThatWarning )
// one single line with ThatWarning

est l'abréviation de (généralement depuis VS 2008 , mais dans VS 2005 pour les avertissements de Code Analyzer uniquement):

#pragma warning ( Push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )
37
m3tikn0b

L'approche correcte (bien qu'un peu moche)

#ifdef _MSC_VER
 #pragma warning( Push )
 #pragma warning( once: ThatWarning )
#endif
 //code with ThatWarning here
#ifdef _MSC_VER
 #pragma warning( pop )
#endif
13
ronag

Vous pouvez désactiver des avertissements spécifiques dans les options de projet ou de fichier et ce paramètre s'applique en tant que "valeur par défaut" pour ces #pragmas à l'étendue appropriée. Certains des avertissements dans VS2005 sont si inutiles/ennuyeux que cela nettoie un peu la sortie, si vous utilisez /W4.

C'est dans Propriétés sous Propriétés de configuration -> C/C++ -> Avancé.

3
Steve Townsend

Je n'ai aucun problème avec la première variante. La meilleure façon est peut-être d'utiliser les éléments suivants:

 #pragma warning( Push )
 #pragma warning( once: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

Cela vous permettra de savoir qu'il y a toujours des avertissements dans le code, mais les messages d'avertissement ne seront pas si ennuyeux. Mais c'est une question de goût.

2