У меня есть проект, который использует библиотеки log4cxx, boost и т.д., чьи заголовки генерируют множество (повторяющихся) предупреждений. Есть ли способ подавить предупреждения из библиотеки (например, #include < some-header.h > ) или включает в себя определенные пути? Я хотел бы использовать -Wall и/или -Wextra, как обычно, в коде проекта, не затеняя соответствующую информацию. В настоящее время я использую grep для вывода вывода, но мне бы хотелось что-то лучше.
Как подавить предупреждения GCC из заголовков библиотек?
Ответ 1
Вы можете попытаться включить заголовки библиотеки, используя -isystem
вместо -I
. Это сделает их "системными заголовками", и GCC не сообщит о предупреждениях для них.
Ответ 2
Для тех, кто использует CMake, вы можете изменить свои директивы include_directories
, чтобы включить символ SYSTEM
, который подавляет предупреждения против таких заголовков.
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
Ответ 3
Вы можете использовать прагмы. Например:
// save diagnostic state
#pragma GCC diagnostic push
// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>
// turn the warnings back on
#pragma GCC diagnostic pop
Ответ 4
Я нашел трюк. В библиотеке вместо -Idir
используйте -isystem dir
в make- -isystem dir
. Затем GCC обрабатывает boost и т.д., Поскольку система включает и игнорирует любые предупреждения от них.
Ответ 5
#pragma
являются инструкциями для компилятора. вы можете установить что-то перед #include и отключить его после.
Вы также можете сделать это в командной строке .
Другая страница GCC специально посвящена отключению предупреждений.
Я бы воспользовался возможностью использования #pragma в исходном коде, а затем предоставил звук (как комментарий) о том, почему вы отключите предупреждения. Это будет означать рассуждения о файлах заголовков.
GCC приближается к этому с помощью классификации типов предупреждений. Вы можете классифицировать их как предупреждения или их игнорировать. В ранее связанных статьях будет показано, какие предупреждения могут быть отключены.
Примечание. Вы также можете массировать исходный код, чтобы предотвратить определенные предупреждения, используя attributes; однако это очень тесно связывает вас с GCC.
Примечание2: GCC также использует интерфейс pop/push, используемый в компиляторе Microsoft - Microsoft отключает предупреждения через этот интерфейс. Я предлагаю вам изучить это дальше, так как я не знаю, возможно ли это.
Ответ 6
Вы можете использовать предварительно скомпилированные заголовки. Предупреждения не исчезнут, но, по крайней мере, они не будут отображаться в вашей основной компиляции.
Ответ 7
Если вам нужно явно переопределить системный заголовок, вы ограничены прагмами. Вы можете проверить, какие из них вы используете с помощью вывода make depend
.
Также см. диагностический push-pop для gcc >= 4.6
Ответ 8
Должны быть причины для этих предупреждений. Они будут либо вызваны ошибками в вашем коде, который использует библиотеку, либо ошибками в самом коде библиотеки. В первом случае исправьте свой код. Во втором случае либо прекратите использовать библиотеку, либо если это код FOSS, исправьте ее.