Как отключить предупреждения #pragma? - PullRequest
44 голосов
/ 25 сентября 2008

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

97 голосов
/ 25 сентября 2008

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

-Wno-unknown-pragmas

чтобы подавить их.

24 голосов
/ 25 сентября 2008

В GCC скомпилировать с -Wno-unknown-pragmas

В MS Visual Studio 2005 (этот вопрос не помечен как gcc, поэтому я добавляю его для справки), вы можете отключить его глобально в настройках проекта -> C / C ++ -> Advanced. Введите 4068 в поле «Отключить определенные предупреждения»

или вы можете добавить это в любой файл, чтобы локально отключить предупреждения

#pragma warning (disable : 4068 ) /* disable unknown pragma warnings */
18 голосов
/ 25 сентября 2008

Возможно см. GCC Diagnostic Pragmas ? В качестве альтернативы в этом случае вы можете использовать комбинацию опций , которую -Wall включает, исключая -Wunknown-pragmas.

7 голосов
/ 27 июля 2012

Спасибо всем за совет. В моем случае я работаю с Qt Mingw. Мне нужно установить флаг другим способом, в моем файле .PRO:

QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas
5 голосов
/ 14 апреля 2018

Я знаю, что вопрос о 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
  • Компилятор 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

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

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

Многие компиляторы также могут помещать / выводить предупреждения в стек, так что вы можете помещать, затем отключать их, прежде чем включать код, который вы не контролируете, а затем выдавать, чтобы ваш код все равно вызывал соответствующее предупреждение. (так что вы можете очистить его). В Хедли тоже есть макросы: HEDLEY_DIAGNOSTIC_PUSH / HEDLEY_DIAGNOSTIC_POP.

...