Как подавить предупреждения GCC из заголовков библиотек?
У меня есть проект, который использует log4cxx, Boost и др. библиотеки, заголовки которых генерируют множество (повторяющихся) предупреждений. Есть ли способ подавить предупреждения из библиотеки includes (т. е. #include ) или включает из определенных путей? Я хотел бы использовать-Wall и/или-Wextra, как обычно, в коде проекта без скрытия соответствующей информации. В настоящее время я использую grep на make output, но я хотел бы что-то лучше.
8 ответов:
вы можете попробовать включить заголовки библиотеки с помощью
-isystem
вместо-I
. Это сделает их "системными заголовками", и GCC не будет сообщать о предупреждениях для них.
для тех, кто использует CMake, вы можете изменить свой
include_directories
директивы для включения символаSYSTEM
, который подавляет предупреждения против таких заголовков.include_directories(SYSTEM "${LIB_DIR}/Include") ^^^^^^
вы можете использовать прагмы. Например:
// 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
Я нашел трюк. Для библиотеки включает в себя, а не - Idir использовать - isystem dir в файле makefile. GCC после этого обрабатывает подталкивание etc. поскольку система включает и игнорирует любые предупреждения от них.
#pragma
инструкции к компилятору. вы можете установить что-то перед #include и отключить его после.вы также можете сделать это на командная строка.
другая страница GCC конкретно на отключение предупреждений.
Я бы пошел на вариант использования #pragma в исходном коде, а затем предоставил звук причина (в качестве комментария), почему вы отключаете предупреждения. Это означало бы рассуждение о файлах заголовков.
GCC приближается к этому с помощью классификация типы предупреждений. Вы можете классифицировать их как предупреждения или как игнорируемые. Ранее связанные статьи покажут вам, какие предупреждения могут быть отключены.
Примечание: Вы также можете массировать исходный код, чтобы предотвратить некоторые предупреждения с помощью атрибуты; однако, это связывает вас довольно близко к GCC.
Note2: GCC также использует pop/push интерфейс как используется в компиляторе microsoft -- Microsoft отключает предупреждения через этот интерфейс. Я предлагаю вам исследовать это дальше, так как я не знаю, возможно ли это вообще.
вы можете попробовать использовать предварительно скомпилированные заголовки. Предупреждения не исчезнут, но, по крайней мере, они не появятся в вашей основной компиляции.
Если вам нужно явно переопределить системный заголовок, то вы ограничены прагами. Вы можете проверить, что включает в себя вы используете через
make depend
выход.см. Также диагностический push-pop для gcc >= 4.6