VC ++ Compiler: Как определить текущий уровень предупреждения или переопределения? - PullRequest
2 голосов
/ 10 июня 2009

У меня есть проект, в котором я только что обнаружил, что предупреждение C4244 (возможная потеря данных) подавляется. Я сильно подозреваю, что какой-то неуклюжий заголовок MS подавляет это предупреждение и оставляет его подавленным для всех блоков перевода, которые включают в себя указанный заголовок, но я не определил, какой из их многочисленных заголовков может быть ошибочным.

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

Кто-нибудь знает, какую директиву компилятора я мог бы использовать или какой подход я мог бы использовать, чтобы получить эту информацию?

Я не могу сказать вам, как неприятно обнаружить, что мои тщательно сконструированные объявления типов в моих заголовках не дают предупреждения компилятора, когда вызывающая сторона нарушает контракт и пытается отправить мне целое число вместо подписанного байта (который имеет привело к текущей ошибке, которую я пытаюсь решить).

Мысли

ПРИМЕЧАНИЯ:

Поиск по #pragma по всему моему решению дает только сбалансированные объявления предупреждения #pragma (отключение: xxxx), за которым следует предупреждение #pragma (по умолчанию: xxxx). И ни одна из этих ссылок 4244.

Поиск по 4244 во всем решении не возвращает совпадений (я никогда не отменяю это предупреждение, равно как и любые из моих включенных библиотек, подпроектов и т. Д.).

Поиск по 4244 по всем путям включения MS возвращает несколько ссылок, которые кажутся сбалансированными или почти такими, в зависимости от символов #define, которые были установлены до их вызова. Отсюда мое подозрение, что MS виноват (в сочетании с предыдущей историей MS, выполняющей небрежную работу в своих заголовках).

Ответы [ 4 ]

1 голос
/ 10 июня 2009

Другой вариант - добавить это

#pragma warning (defualt) 

вверху файла сразу после #include s Это сбрасывает предупреждение по умолчанию, отбрасывая любое игнорирование, которое могло быть вызвано.

С другой стороны, я считаю маловероятным, что заголовок Microsoft отключит предупреждение.

0 голосов
/ 10 июня 2009

После дальнейшего расследования:

/ P занимает слишком много времени (я никогда не видел, чтобы за несколько часов он выходил за пределы нескольких файлов, поэтому я отменил эту сборку)

Мне так и не удалось найти четкий способ распечатать текущий уровень предупреждений или какие-либо переопределения, действовавшие в данный момент компиляции. Поэтому на вопрос, который я задал, ответа нет, если только аргумент / P на самом деле не полезен для вас (как я уже говорил, он был непрактичным для моих целей).

Что я смог сделать, так это создать несколько встроенных вызовов в различных заголовках, которые должны генерировать необходимое предупреждение, если уровень предупреждения включал это предупреждение как активное, чтобы проверить, было ли это предупреждение активным или нет:

inline int test (char value) {return ++ value; }

включает "что-то"

inline int test1 (int value) {return test (value); } // должен генерировать C4244 - возможная потеря данных, если предыдущий #include не испортил уровень предупреждения или не переопределил предупреждение 4244.

И так далее ...

В конце концов, я обнаружил, что, в частности, 4244 имеет некоторые странные правила, связанные с ним, и что он фактически «отключен» во всех, кроме / W4 (уровень предупреждения 4) - самый высокий уровень предупреждения. Так как этот уровень предупреждения очень, очень обидчив и жалуется на множество вещей, которые выходят за рамки нашей компетенции, я не хотел включать /W4.

Вместо этого я поместил в наш stdafx.h PCH следующее:

pragma warning (error: 4244) // это полностью включает предупреждения о возможной потере данных из-за неявного преобразования типов при любых обстоятельствах независимо от активного уровня предупреждения

Это сработало.

Итак, MS не оставила несбалансированные переопределения предупреждений ни в одном из своих файлов, которые затронули нас. Просто 4244 очень прощающий, за исключением самого высокого уровня предупреждения, где он становится действительно полезным для нас, в любом случае.

Спасибо за вашу помощь!

0 голосов
/ 10 июня 2009

Вы можете начать с использования опции командной строки компилятора / P . Он выводит в файл вывод препроцессора. таким образом вы можете убедиться, что это действительно заголовок, который добавляет предупреждение отключить, и попытаться собрать некоторые подсказки относительно того, каким заголовком он может быть.

0 голосов
/ 10 июня 2009

Можете ли вы просто выполнить поиск по всем файлам заголовков для "C4244" или у вас есть доступ только к предварительно скомпилированным файлам заголовков?

...