Подтвердить что ты не робот

Использует ли #pragma warning push/pop правильный способ временного изменения уровня предупреждения?

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

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

Первый - использовать #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 отменит эти изменения.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Update

Ответ 3

Слишком поздно для sharptooth, но для всех googlers там:

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

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

#pragma warning ( push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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