Как отключить предупреждения #pragma?

при разработке приложения на 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++?

5 ответов


Я считаю, что вы можете скомпилировать с

-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) или в коде (исключение: DMC):

  • GCC:-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)
  • PGI:#pragma diag_suppress 1675
  • индекса MSVC: -wd4068 / #pragma warning(disable:4068)
  • TI:--diag_suppress,-pds=163 / #pragma diag_suppress 163
  • компилятор IAR C/C++:--diag_suppress Pe161 / #pragma diag_suppress=Pe161
  • Цифровой Компилятор 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 (это один общедоступный заголовок C/C++, который вы можете легко поместить в свой проект), вы можете использовать Hedley в качестве руководства вместо приведенной выше информации.

проверки версий, вероятно, слишком пессимистичны, но иногда трудно получить хорошую информацию об устаревших версиях проприетарных компиляторов, и я предпочел бы быть в безопасности, чем сожалеть. Опять же, информация Хедли может быть лучше.

многие компиляторы могут также нажмите/pop предупреждения в стек, так что вы можете нажать, а затем отключить их, прежде чем включать код, который вы не контролируете, а затем pop so код код все равно вызовет соответствующее предупреждение (чтобы вы могли его очистить). Для этого в Hedley тоже есть макросы:HEDLEY_DIAGNOSTIC_PUSH / HEDLEY_DIAGNOSTIC_POP.