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

de temps en temps, il est difficile d'écrire du code C++ qui n'émettrait pas d'Avertissements. Avoir activé les Avertissements est cependant une bonne idée. Il est donc souvent nécessaire de désactiver les Avertissements autour d'une construction spécifique et de les avoir activés dans tous les autres morceaux de code.

j'ai vu deux manières de le faire jusqu'à présent.

La première est d'utiliser #pragma warning( push ) et #pragma warning( pop ) :

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

La seconde est d'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'elle écarte le niveau d'avertissement initial - l'avertissement pourrait avoir été éteint avant que cela ou son niveau d'avertissement pourrait avoir été modifié. L'utilisation de default écarterait ces modifications.

La première approche a l'air propre. Existe-il des problèmes avec elle? Sont-il de meilleures façons d'atteindre le même?

57
demandé sur Steve Townsend 2010-11-16 14:04:56

6 réponses

la première méthode est la meilleure façon de le faire, IMO. Je ne connais pas de problèmes avec elle.

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

28
répondu Goz 2010-11-16 11:08:45

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

Utilisation

// 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
// ...

en Outre comprendre des gardes pouvez vérifier qu'il n'y a pas de double push/pop/désactiver l'avertissement de pragmas.

mise à jour

37
répondu 2014-08-13 07:35:20

trop tard pour sharptooth mais pour tous les googlers là-bas:

#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 L'Analyseur de Code seulement):

#pragma warning ( push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )
31
répondu m3tikn0b 2013-08-27 09:12:25

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
12
répondu ronag 2010-11-16 12:20:44

vous pouvez désactiver des avertissements spécifiques dans les options projet ou fichier et ce paramètre s'applique comme le "défaut" selon les #pragmas à la portée pertinente. Certains avertissements de VS2005 sont tellement inutiles / gênants que cela nettoie la sortie un peu, si vous utilisez /W4 .

C'est dans Propriétés sous Propriétés de Configuration -> C/C++ -> avancé.

3
répondu Steve Townsend 2010-11-16 12:30:43

je n'ai aucun problème avec la première variante. Peut-être le meilleur moyen est d'utiliser ce qui suit:

 #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 question de goût.

2
répondu Kirill V. Lyadvinsky 2010-11-16 11:22:18