Как подавить предупреждения GCC из заголовков библиотек?

У меня есть проект, который использует библиотеки log4cxx, boost и т.д., чьи заголовки генерируют множество (повторяющихся) предупреждений. Есть ли способ подавить предупреждения из библиотеки (например, #include < some-header.h > ) или включает в себя определенные пути? Я хотел бы использовать -Wall и/или -Wextra, как обычно, в коде проекта, не затеняя соответствующую информацию. В настоящее время я использую grep для вывода вывода, но мне бы хотелось что-то лучше.

Ответ 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 отключает предупреждения через этот интерфейс. Я предлагаю вам изучить это дальше, так как я не знаю, возможно ли это.

Ответ 7

Если вам нужно явно переопределить системный заголовок, вы ограничены прагмами. Вы можете проверить, какие из них вы используете с помощью вывода make depend.

Также см. диагностический push-pop для gcc >= 4.6

Ответ 8

Должны быть причины для этих предупреждений. Они будут либо вызваны ошибками в вашем коде, который использует библиотеку, либо ошибками в самом коде библиотеки. В первом случае исправьте свой код. Во втором случае либо прекратите использовать библиотеку, либо если это код FOSS, исправьте ее.