Является ли использование #pragma warning push / pop правильным способом для временного изменения уровня предупреждения? - PullRequest
64 голосов
/ 16 ноября 2010

Время от времени трудно писать код на C ++, который бы вообще не выдавал предупреждения. Однако включение предупреждений - хорошая идея. Поэтому часто бывает необходимо отключить предупреждения вокруг какой-либо конкретной конструкции и включить их во всех других частях кода.

Я видел два способа сделать это до сих пор.

Первый должен использовать #pragma warning( push ) и #pragma warning( pop ):

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

Второй должен использовать #pragma warning( default ):

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

Проблема, которую я вижу во втором варианте, заключается в том, что он отбрасывает исходный уровень предупреждения - предупреждение могло быть отключено до этого или его уровень предупреждения мог быть изменен. Использование default отменит эти изменения.

Первый подход выглядит чисто. Есть ли с этим проблемы? Есть ли лучшие способы добиться того же?

Ответы [ 6 ]

40 голосов
/ 27 августа 2013

Это будет работать с несколькими компиляторами (и разными версиями компиляторов).

Заголовок "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

Заголовок "pop"

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

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

Некоторыепредупреждение

#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

Использование

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

Кроме того, включенные охранники могут проверить, что нет прагм двойного нажатия / всплывающего / отключенного предупреждения.

Обновление

37 голосов
/ 27 августа 2013

Слишком поздно для Sharp, но для всех гуглеров там:

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

сокращенно (обычно с VS 2008 , но в VS 2005 только для предупреждений анализатора кода):

#pragma warning ( push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )
32 голосов
/ 16 ноября 2010

Первый способ - лучший способ сделать это, ИМО. Я не знаю проблем с этим.

Просто имейте в виду, что #pragma зависит от компилятора, поэтому не ожидайте, что он будет работать на каждом компиляторе:)

13 голосов
/ 16 ноября 2010

Правильный подход (хотя и немного некрасиво)

#ifdef _MSC_VER
 #pragma warning( push )
 #pragma warning( once: ThatWarning )
#endif
 //code with ThatWarning here
#ifdef _MSC_VER
 #pragma warning( pop )
#endif
3 голосов
/ 16 ноября 2010

Вы можете отключить определенные предупреждения в параметрах проекта или файла, и этот параметр применяется как «значение по умолчанию» для этих #pragmas в соответствующей области. Некоторые предупреждения в VS2005 настолько бесполезны / раздражают, что это немного очищает вывод, если использовать /W4.

Это находится в Свойствах в Свойствах конфигурации -> C / C ++ -> Дополнительно.

2 голосов
/ 16 ноября 2010

У меня нет проблем с первым вариантом. Может быть, лучше использовать следующее:

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

Это даст вам знать, что в коде все еще есть предупреждения, но предупреждающие сообщения не будут такими раздражающими. Но это дело вкуса.

...