Есть ли способ отключить все предупреждения с помощью pragma?
-
22-08-2019 - |
Вопрос
Я запустил новый проект и решил убедиться, что он строится чисто с включенной опцией / Wall.Единственная проблема заключается в том, что не все сторонние библиотеки (например, boost) компилируются без предупреждений, поэтому я прибегнул к выполнению этого в общем заголовке:
#pragma warning(push)
#pragma warning(disable:4820)
#pragma warning(disable:4619)
#pragma warning(disable:4668)
#pragma warning(disable:4625)
#pragma warning(disable:4626)
#pragma warning(disable:4571)
#pragma warning(disable:4347)
#pragma warning(disable:4640)
#pragma warning(disable:4365)
#pragma warning(disable:4710)
#pragma warning(disable:4820)
#pragma warning(disable:4350)
#pragma warning(disable:4686)
#pragma warning(disable:4711)
#pragma warning(disable:4548)
#include <boost/array.hpp>
#include <boost/assert.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
#include <boost/format.hpp>
#include <boost/function.hpp>
#include <boost/integer.hpp>
#include <boost/optional.hpp>
#include <boost/regex.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/utility.hpp>
#include <boost/variant.hpp>
#pragma warning(pop)
Это работает достаточно хорошо, но каждый раз, когда я добавляю новые заголовки boost, мне приходится добавлять в список все предупреждения, которые они генерируют.Есть ли способ сказать отключить все предупреждения для этого участка кода?
Решение
Вы можете нажать / вывести предупреждение низкого уровня, например, так:
#pragma warning(push, 0)
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
// ...
#pragma warning(pop)
Но знайте, что это невозможно отключить ВСЕ предупреждения.Например, некоторые предупреждения компоновщика невозможно отключить.
Другие советы
#pragma warning(disable:4820)
#pragma warning(disable:4619)
#pragma warning(disable:4668)
для меньшего количества строк....
#pragma warning (disable : 4820 4619 4668)
То, что я делал раньше, - это устанавливал опцию "W3" вместо "Wall", затем в каждом из моих собственных файлов source .cpp я помещал
#pragma warning(push, 4)
вверху ПОСЛЕ всех строк "#включить ...", а затем
#pragma warning(pop)
как самая последняя строка файла.
Таким образом, вы получаете предупреждения 4-го уровня в своем коде и 3-го уровня в стороннем коде, с которыми вы ничего не можете поделать.
Используя методику, описанную в Ответ Асафа Лави можно создавать вспомогательные макросы:
#define DISABLE_ALL_WARNINGS_BEGIN \
__pragma(warning(push, 0))
#define DISABLE_ALL_WARNINGS_END \
__pragma(warning(pop))
Они могут быть использованы следующим образом (онлайн-демо-версия):
DISABLE_ALL_WARNINGS_BEGIN
void foo(int a)
{
// this function should generate the following warning
// "warning C4100: 'a': unreferenced formal parameter"
// unless it is not wrapped inside "DISABLE_ALL_WARNINGS" section
}
DISABLE_ALL_WARNINGS_END