Как отключить предупреждения #pragma?
-
02-07-2019 - |
Вопрос
При разработке приложения на C++ мне пришлось использовать стороннюю библиотеку, которая выдавала огромное количество предупреждений, связанных с использованием безобидной директивы #pragma.
../File.hpp:1: warning: ignoring #pragma ident
In file included from ../File2.hpp:47,
from ../File3.hpp:57,
from File4.h:49,
Можно ли отключить подобные предупреждения при использовании компилятора GNU C++?
Решение
Я считаю, что вы можете скомпилировать с
-Wno-unknown-pragmas
чтобы подавить их.
Другие советы
В GCC скомпилируйте с -Wno-unknown-pragmas
В MS Visual Studio 2005 (этот вопрос не помечен тегом gcc, поэтому я добавляю его для справки) вы можете отключить глобально в «Настройки проекта» -> «C/C++» -> «Дополнительно».Введите 4068 в поле «Отключить определенные предупреждения».
или вы можете добавить это в любой файл, чтобы локально отключить предупреждения.
#pragma warning (disable : 4068 ) /* disable unknown pragma warnings */
Возможно, см. Диагностические прагмы GCC?В качестве альтернативы в этом случае вы можете использовать комбинация вариантов что -Wall
позволяет, исключая -Wunknown-pragmas
.
Спасибо всем за подсказку.В моем случае я работаю с Qt Mingw.Мне нужно установить флаг другим способом, в моем файле .PRO:
QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas
Я знаю, что вопрос касается GCC, но для людей, желающих сделать это как можно более портативно:
Большинство компиляторов, которые могут выдавать это предупреждение, имеют возможность отключить предупреждение либо из командной строки (исключение:PGI) или в коде (исключение:ДМК):
- ССЗ:
-Wno-unknown-pragmas
/#pragma GCC diagnostic ignored "-Wunknown-pragmas"
- лязг:
-Wno-unknown-pragmas
/#pragma clang diagnostic ignored "-Wunknown-pragmas"
- Компилятор Intel C/C++:
-diag-disable 161
/#pragma warning(disable:161)
- ЗГУ:
#pragma diag_suppress 1675
- МСВК:
-wd4068
/#pragma warning(disable:4068)
- ТИ:
--diag_suppress,-pds=163
/#pragma diag_suppress 163
- Компилятор IAR C/C++:
--diag_suppress Pe161
/#pragma diag_suppress=Pe161
- Компилятор Digital Mars C/C++:
-w17
Вы можете объединить большую часть этого в один макрос и использовать его в своем коде, что я и сделал для HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
макрос в Хедли:
#if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
#elif HEDLEY_INTEL_VERSION_CHECK(16,0,0)
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
#elif HEDLEY_PGI_VERSION_CHECK(17,10,0)
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
#elif HEDLEY_GNUC_VERSION_CHECK(4,3,0)
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
#elif HEDLEY_MSVC_VERSION_CHECK(15,0,0)
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
#elif HEDLEY_TI_VERSION_CHECK(8,0,0)
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
#elif HEDLEY_IAR_VERSION_CHECK(8,0,0)
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
#else
# define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
#endif
Обратите внимание, что у Hedley может быть более полная информация, чем в этом ответе, поскольку я, вероятно, забуду обновить этот ответ, поэтому, если вы не хотите просто использовать Hedley (это один общедоступный заголовок C/C++, который вы можете легко добавить в свой проект). ) вы можете использовать Хедли в качестве руководства вместо приведенной выше информации.
Проверки версий, вероятно, слишком пессимистичны, но иногда трудно получить достоверную информацию об устаревших версиях проприетарных компиляторов, и я предпочитаю перестраховаться, чем сожалеть.Опять же, информация Хедли может быть лучше.
Многие компиляторы также могут помещать/извлекать предупреждения в стек, поэтому вы можете помещать их, а затем отключать, прежде чем включать код, который вы не контролируете, а затем извлекать их. твой код все равно вызовет соответствующее предупреждение (так что вы можете его очистить).В Hedley для этого тоже есть макросы: HEDLEY_DIAGNOSTIC_PUSH
/ HEDLEY_DIAGNOSTIC_POP
.