К сожалению, я не думаю, что MSVC предоставляет хороший способ справиться с этой проблемой.Я думаю, что вам нужно либо продолжать явно включать / выключать предупреждения, когда эти заголовки включены (возможно, с помощью макросов pragma, чтобы сделать его немного проще , как предложил Преториан ), либо обернуть заголовки в свои собственные заголовки, которыеуправлять уровнем предупреждения.Преимущество второго варианта состоит в том, что его нужно выполнить только один раз.Вы можете сделать это так, чтобы не требовалось изменять каждый файл, который включает в себя исходные заголовки.
Скажите, что HeaderGeneratingWarnings.h
находится в каталоге ExtLibDir
, который настроен для добавления вашего проекта / make-файлак компилятору включить путь поиска.Одна вещь, которую вы могли бы рассмотреть, это добавить «параллельный» каталог, ExtLibDirWrapper
и использовать , что , в конфигурации проекта / make-файла.Пусть он содержит набор заголовков, которые выглядят примерно так:
ExtLibDir\HeaderGeneratingWarnings.h
:
#ifndef HEADERGENERATINGWARNINGS_WRAPPER
#define HEADERGENERATINGWARNINGS_WRAPPER
#if defined(_MSC_VER)
# pragma warning( push, 3 )
#endif
#include "../ExtLibDir/SomeExternalHeader.h"
#if defined(_MSC_VER)
# pragma warning( pop )
#endif
#endif /* HEADERGENERATINGWARNINGS_WRAPPER */
Начальный набор боли, нодовольно механический процесс - сценарий, вероятно, можно было бы быстро отключить, чтобы позаботиться обо всем этом.Надеемся, что с этого момента и будет решена проблема.
Кроме того, у GCC есть хороший способ решить эту проблему:
Заголовочные файлы, объявляющие интерфейсы к операционной системе и библиотекам времени выполнения, часто не могут быть записаны в строго соответствующем C. Следовательно, GCC придает коду, найденному в системных заголовках, специальную обработку.Все предупреждения, кроме генерируемых #warning (см. Диагностика), подавляются, пока GCC обрабатывает системный заголовок.Макросы, определенные в системном заголовке, защищены от нескольких предупреждений, где бы они ни были развернуты.Этот иммунитет предоставляется на специальной основе, когда мы обнаруживаем, что предупреждение генерирует много ложных срабатываний из-за кода в макросах, определенных в системных заголовках.
Обычно только заголовки, найденные в определенных каталогах, считаются системнымизаголовки.Эти каталоги определяются при компиляции GCC.Однако есть два способа сделать нормальные заголовки системными заголовками.
Параметр командной строки -isystem добавляет свой аргумент в список каталогов для поиска заголовков, как -I.Любые заголовки, найденные в этом каталоге, будут считаться системными заголовками.
Все каталоги, названные -isystem, ищутся после всех каталогов, названных -I, независимо от их порядка в командной строке.Если один и тот же каталог имеет имена и -I, и -isystem, опция -I игнорируется.GCC выдает информативное сообщение, когда это происходит, если используется -v.
Существует также директива #pragma GCC system_header, которая указывает GCC рассматривать остальную часть текущего включаемого файла как системный заголовок, независимо от того, гдебыло обнаружено.Код, стоящий перед #pragma
в файле, не будет затронут.#pragma GCC system_header не влияет на первичный исходный файл.