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


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

8 101

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

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