Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top