Предупреждения компилятора, выключенные по умолчанию

Компилятор поддерживает предупреждения, отключенные по умолчанию, так как большинство разработчиков не находят их полезными. В некоторых случаях они предупреждают о стилистическом выборе или о распространенных идиомах в более старом коде. Другие предупреждения относятся к использованию расширения Майкрософт на языке. Некоторые предупреждения указывают на область, в которой программисты часто делают неправильные предположения, что может привести к неожиданному или неопределенному поведению. Если все эти предупреждения включены, некоторые из них могут отображаться несколько раз в заголовках библиотеки. Библиотеки среды выполнения C и стандартные библиотеки C++ предназначены для выдачи предупреждений только на уровне /W4предупреждений.

Включение предупреждений, отключенных по умолчанию

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

  • #pragma warning(default :warning_number)

    Указанное предупреждение (warning_number) включено на уровне по умолчанию. Документация по предупреждениям содержит уровень предупреждения по умолчанию.

  • #pragma warning(:warning_level warning_number warning_number)

    Указанное предупреждение (warning_number) включено на указанном уровне (warning_level).

  • /Wall

    /Wall включает все предупреждения, в том числе предупреждения, отключенные по умолчанию. При использовании этого параметра можно отключить отдельные предупреждения с помощью /wd этого параметра.

  • /wLnnnn

    Этот параметр включает предупреждение nnnn на уровне L.

Предупреждения, отключенные по умолчанию

Visual Studio 2015 и более поздних версий

Следующие предупреждения отключены по умолчанию в Visual Studio 2015 и более поздних версиях:

Предупреждение Message
C4061 (уровень 4) перечислитель "идентификатор" в переключателе перечисления "перечисление" не обрабатывается явным образом меткой регистра.
C4062 (уровень 4) перечислитель "идентификатор" в переключателе перечисления "перечисление" не обрабатывается.
C4165 (уровень 1) HRESULT преобразуется в bool; Вы уверены, что это то, что вы хотите?
C4191 (уровень 3) Оператор: небезопасное преобразование из "type_of_expression" в "type_required"
C4242 (уровень 4) "идентификатор": преобразование из "type1" в "type2", возможная потеря данных
C4254 (уровень 4) Оператор: преобразование из типа1 в тип2, возможная потеря данных
C4255 (уровень 4) "function": не задан прототип функции: преобразование "()" в "(void)"
C4263 (уровень 4) "function": функция-член не переопределяет любую функцию виртуального члена базового класса
C4264 (уровень 1) "virtual_function": не переопределяется для функции виртуального члена из базового класса; функция скрыта.
C4265 (уровень 3) "class": класс имеет виртуальные функции, но деструктор не является виртуальным
C4266 (уровень 4) "function": не существует переопределения для виртуальной функции-члена из базового типа; функция скрыта.
C4287 (уровень 3) Оператор: несоответствие без знака или отрицательной константы
C4289 (уровень 4) нестандартное расширение, используемое : var: переменная управления циклом, объявленная в цикле, используется вне область
C4296 (уровень 4) Оператор: выражение всегда равно false
C4339 (уровень 4) Type: использование неопределенного типа, обнаруженного в метаданных СРЕДЫ CLR. Использование этого типа может привести к исключению среды выполнения.
C4342 (уровень 1) изменение поведения: "function" вызывается, но оператор-член был вызван в предыдущих версиях
C4350 (уровень 1) изменение поведения: "member1" вызывается вместо "member2"
C4355 'this': используется в основном списке инициализации членов
C4365 (уровень 4) "action": преобразование из "type_1" в "type_2", подписанный или неподписанный несоответствие
C4370 (уровень 3) размещение класса изменилось по сравнению с предыдущей версией компилятора из-за улучшенной упаковки
C4371 (уровень 3) "class-name": макет класса, возможно, изменился с предыдущей версии компилятора из-за лучшей упаковки элемента "member"
C4388 (уровень 4) несоответствие типов со знаком и без знака
C4412 (уровень 2) "function": сигнатура функции содержит тип "type"; Объекты C++ небезопасны для передачи между чистым кодом и смешанным или собственным кодом
C4426 (уровень 1) Флаги оптимизации изменились после включения заголовка, могут быть вызваны #pragma optimize() 14.1
C4435 (уровень 4) Class1: макет объекта в /vd2 изменится из-за виртуальной базы "class2".
C4437 (уровень 4) dynamic_cast из виртуальной базы "class1" в "class2" может завершиться ошибкой в некоторых контекстах.
C4444 (уровень 3) Верхний уровень "__unaligned" не реализуется в этом контексте.
C4464 (уровень 4) относительный путь включения содержит ".".
C4471 (уровень 4) Объявление пересылки перечисления un область d должно иметь базовый тип (предполагается int) Perm
C4472 (уровень 1) Идентификатор — это собственный перечисление: добавьте описатель доступа (частный/общедоступный), чтобы объявить управляемую перечисление.
C4514 (уровень 4) "function": удалена встроенная функция без ссылок
C4536 (уровень 4) "имя типа": имя типа превышает предел метаданных символов "limit"
C4545 (уровень 1) вычисление выражения перед запятой дает функцию, в которой отсутствует список аргументов
C4546 (уровень 1) в вызове функции перед запятой отсутствует список аргументов
C4547 (уровень 1) Оператор "operator": оператор до запятой не имеет эффекта; ожидаемый оператор с побочным эффектом
C4548 (уровень 1) выражение перед запятой не имеет результата; требуется выражение с побочным действием
C4549 (уровень 1) "operator1": оператор до запятой не действует; вы намерены "оператор2"?
C4555 (уровень 1) выражение не имеет результата; требуется выражение с побочным действием
C4557 (уровень 3) "__assume" содержит эффект "эффект"
C4571 (уровень 4) информационная: семантика catch(...) изменилась с момента изменения Visual C++ 7.1; структурированные исключения (SEH) больше не перехватываются
C4574 (уровень 4) "идентификатор" определен как "0": означает ли вы использовать "#if идентификатор"?
C4577 ( уровень 1) 'noexcept' используется без указанного режима обработки исключений; завершение исключения не гарантируется. Укажите /EHsc
C4582 (уровень 4) "type": конструктор неявно вызывается
C4583 (уровень 4) Тип: деструктор неявно называется
C4587 (уровень 1) "anonymous_structure": изменение поведения: конструктор больше не вызывается неявно
C4588 (уровень 1) "anonymous_structure": изменение поведения: деструктор больше не вызывается неявно
C4596 (уровень 4) "идентификатор": незаконное полное имя в объявлении члена 14.3Перм
C4598 (уровень 1 и уровень 3) "#include "header": номер заголовка в предварительно компилированного заголовка не соответствует текущей компиляции в этой позиции 14.3.
C4599 (уровень 3) "путь к параметру": номер аргумента командной строки arg_number не соответствует предварительно скомпилированному заголовку 14.3
C4605 (уровень 1) Макрос "/D", указанный в текущей командной строке, но не был указан при создании предварительно скомпилированного заголовка
C4608 (уровень 3) "union_member" уже был инициализирован другим членом профсоюза в списке инициализатора "union_member" Перм
C4619 (уровень 3) предупреждение #pragma: нет номера предупреждения "число"
C4623 (уровень 4) "derived class": не удалось создать конструктор по умолчанию, так как конструктор по умолчанию для базового класса недоступен
C4625 (уровень 4) "derived class": не удалось создать конструктор копии, так как конструктор копии для базового класса недоступен
C4626 (уровень 4) "derived class": не удалось создать оператор присваивания, так как оператор присваивания для базового класса недоступен
C4628 (уровень 1) диграфы не поддерживаются при наличии параметра -Ze. Последовательность символов "digraph" не интерпретируется как альтернативный маркер для "char"
C4640 (уровень 3) "экземпляр": построение локального статического объекта не является потокобезопасной
C4643 (уровень 4) Перенаправление объявления "идентификатор" в std пространства имен запрещено стандартом C++ . 15.8
C4647 (уровень 3) изменение поведения: __is_pod(тип) имеет другое значение в предыдущих версиях
C4654 (уровень 4) Код, помещенный перед включением предварительно скомпилированных строк заголовков, будет игнорироваться. Добавьте код в предварительно скомпилированные заголовки. 14.1
C4668 (уровень 4) Символ не определен как макрос препроцессора, заменив "0" на "директивы"
C4682 (уровень 4) "символ": атрибут параметра направления не указан, значение по умолчанию — [in]
C4686 (уровень 3) "определяемый пользователем тип": возможное изменение поведения, изменение в соглашении о возврате определяемого пользователем типа
C4692 (уровень 1) "function": сигнатура не частного члена содержит собственный тип сборки "native_type"
C4710 (уровень 4) "function": функция не вложена
C4738 (уровень 3) хранение результатов в памяти в 32-разрядном формате с плавающей запятой, возможно снижение производительности
C4746 переменный доступ "expression" подвержен /volatile:<iso|ms> setting; рассмотрите возможность использования встроенных функций __iso_volatile_load/store
C4749 (уровень 4) условно поддерживаемое: смещение применяется к типу "type" нестандартного макета.
C4767 (уровень 4) Имя раздела "символ" больше 8 символов и будет усечен компоновщиком
C4774 (уровень 4) "string" : формат строки, ожидаемой в номере аргумента, не является строковым литералом
C4777 (уровень 4) "function": строка форматирования "string" требует аргумент типа "type1", но номер аргумента variadic имеет тип "type2"
C4786 (уровень 3) "символ": имя объекта усечено на "число" символов в отладочной информации
C4800 (уровень 4) Неявное преобразование из типа в bool. Возможная потеря информации 16.0
C4820 (уровень 4) Заполнение байтов "байтов" добавлено после создания "member_name"
C4822 (уровень 1) "member": функция-член локального класса не имеет тела
C4826 (уровень 2) Преобразование типа "type1" в "type2" расширено. Это может привести к непредвиденному поведению среды выполнения.
C4837 (уровень 4) триграф обнаружил: "??символ", замененный "символом"
C4841 (уровень 4) используется нестандартное расширение: составной конструктор элементов, используемый в смещениях
C4842 (уровень 4) Результат "offsetof", примененный к типу с использованием нескольких наследование, не гарантирует согласованность между выпусками компилятора
C4866 (уровень 4) Компилятор file(line-number)" может не применять порядок оценки слева направо для вызова оператора
C4868 (уровень 4) Компилятор file(line_number)" может не применять порядок оценки слева направо в списке инициализации с скобками
C4905 (уровень 1) приведение двухбайтового строкового литерала к "LPSTR"
C4906 (уровень 1) строковой литерал приведен к "LPWSTR"
C4917 (уровень 1) "декларатор": GUID может быть связан только с классом, интерфейсом или пространством имен.
C4928 (уровень 1) недопустимая инициализация копии; неявно применено несколько пользовательских преобразований
C4931 (уровень 4) предполагается, что при построении библиотека типов была рассчитана на "число"-разрядные указатели
C4946 (уровень 1) reinterpret_cast используется между связанными классами: Class1 и Class2
C4962 "function": оптимизации, управляемые профилем, отключены, так как оптимизации привели к несогласованности данных профиля
C4986 (уровень 4) "symbol": спецификация исключений не соответствует предыдущему объявлению
C4987 (уровень 4) используется нестандартное расширение: throw (...)
C4988 (уровень 4) "symbol": переменная, объявленная вне класса или функции область
C5022 Type: несколько конструкторов перемещения, указанных
C5023 Type: несколько операторов назначения перемещения, указанных
C5024 (уровень 4) "type": конструктор перемещения был неявно определен как удаленный
C5025 (уровень 4) "type": оператор назначения перемещения неявно определен как удаленный
C5026 (уровень 1 и уровень 4) "type": конструктор перемещения был неявно определен как удаленный
C5027 (уровень 1 и уровень 4) "type": оператор назначения перемещения неявно определен как удаленный
C5029 (уровень 4) нестандартное расширение: атрибуты выравнивания в C++ применяются только к переменным, элементам данных и типам тегов
C5031 (уровень 4) #pragma предупреждения(pop): вероятно, несоответствие, всплывающее состояние предупреждения, отправленное в другом файле 14.1
C5032 (уровень 4) обнаружено предупреждение #pragma (push) без соответствующего предупреждения #pragma(pop) 14.1

Visual Studio 2017 и более поздних версий

Следующие предупреждения отключены по умолчанию в Visual Studio 2017 и более поздних версиях:

Предупреждение Message
C5034 использование встроенного "встроенного" приводит к компиляции имени функции в качестве гостевого кода 15.3.
C5035 Использование функции "feature" приводит к компиляции имени функциив качестве гостевого кода 15.3.
C5036 (уровень 1) Преобразование указателя функции varargs при компиляции с помощью /hybrid:x86arm64 "type1" в "type2" 15.3
C5038 (уровень 4) Член данных "member1" будет инициализирован после элемента данных "member2" 15.3
C5039 (уровень 4) Function: указатель или ссылка на потенциально вызываемую функцию, переданную в функцию extern C в разделе -EHc. Неопределенное поведение может произойти, если эта функция создает исключение. 15.5
C5041 (уровень 4) "member-name": внестрочное определение статического элемента данных constexpr не требуется и не рекомендуется использовать в C++17. 15.2
C5042 (уровень 3) Function: объявления функций в блоке область нельзя указать inline в стандартном C++; удалить описатель inline 15.5.
C5045 Компилятор вставляет устранение рисков Spectre для загрузки памяти, если параметр /Qspectre указан 15.7

Visual Studio 2019 и более поздних версий

Следующие предупреждения отключены по умолчанию в Visual Studio 2019 и более поздних версиях:

Предупреждение Message
C5052 (уровень 3) Ключевое слово "ключевое слово-name" было введено в версии C++ и требует использования параметра командной строки option 16.1
C5204 (уровень 3) Класс с виртуальными функциями имеет не-виртуальный деструктор. 16.5
C5214 (уровень 4) применение "ключевое слово" к операнду с переменным квалифицированным типом устарело в C++20 16.7
C5215 (уровень 4) Параметр функции с переменным типом не рекомендуется использовать в C++20 16.7
C5216 (уровень 4) "return-type" переменный тип возвращаемого значения не рекомендуется использовать в C++20 16.7
C5217 (уровень 4) Структурированное объявление привязки, включающее переменную, не рекомендуется использовать в C++20 16.7.
C5219 (уровень 2) неявное преобразование из типа 1 в тип-2, возможное потеря данных 16.7
C5220 (уровень 4) "member": нестатический член данных с изменяющимся типом больше не подразумевает, что
Компилятор создал конструкторы копирования и перемещения и операторы назначения копирования и перемещения не являются тривиальными 16.7
C5233 (уровень 4) явный лямбда-захват "идентификатор" не используется 16.10
C5240 (уровень 4) Атрибут "attribute-name": атрибут игнорируется в этой синтаксической позиции 16.10
C5243 (уровень 1) "type-name": использование неполного класса "class-name" может вызвать потенциальное нарушение правила определения из-за ограничения ABI 16.10
C5245 (уровень 4) "function": удалена функция без ссылок с внутренней компоновкой
C5246 (уровень 1) "member": инициализация подобъекта должна быть заключена в фигурные скобки 16.10
C5247 (уровень 1) Раздел "имя раздела" зарезервирован для динамической инициализации C++. Создание раздела вручную будет препятствовать динамической инициализации C++ и может привести к неопределенному поведению 16.11
C5248 (уровень 1) Раздел "имя раздела" зарезервирован для динамической инициализации C++. Переменная вручную помещается в раздел, и его порядок относительно созданных компилятором динамических инициализаторов не указан 16.11.

Visual Studio 2022 и более поздних версий

Следующие предупреждения отключены по умолчанию в Visual Studio 2022 и более поздних версиях:

Предупреждение Message
C5249 (уровень 1) Bitfield типа "enumeration_name" имеет именованные перечислители со значениями, которые не могут быть представлены в заданной ширине битового поля "bitfield_width". 17.0
C5250 (уровень 3) "function_name": встроенная функция не объявлена. 17.0
C5251 (уровень 4) Имя сегмента изменилось после включения заголовка 17.1
C5254 (уровень 4) Для функции языка "terse static assert" требуется флаг компилятора "/std:c++17" 17.1
C5256 (уровень 1) Перечисление: неопределяющее объявление перечисления с фиксированным базовым типом разрешено только в виде автономного объявления 17.2.
C5258 (уровень 4) явное запись символа не требуется для этого использования 17.2.
C5259 (уровень 4) "специализированный тип": явная специализация требует "template <>" 17.3
C5262 (уровень 1, ошибка) неявное падение происходит здесь; вы отсутствуете break заявление? Используется [[fallthrough]] , если break инструкция намеренно опущена между вариантами 17.4
C5263 (уровень 4) Вызов 'std::move' во временном объекте предотвращает копирование elision 17.4
C5264 (уровень 4) "переменная-имя": переменная const не используется 17.4
C5266 (уровень 4) Квалификатор const для возвращаемого типа не имеет эффекта 17.6.
C5267 (уровень 4) Определение неявного оператора конструктора или назначения копирования для типа не рекомендуется, так как он имеет оператор назначения, предоставленный пользователем, или конструктор копирования 17.7

14.1 Это предупреждение доступно начиная с Visual Studio 2015 с обновлением 1.
14.3 Это предупреждение доступно начиная с Visual Studio 2015 с обновлением 3.
15.2 Это предупреждение доступно начиная с Visual Studio 2017 версии 15.2.
15.3 Это предупреждение доступно начиная с Visual Studio 2017 версии 15.3.
15.5 Это предупреждение доступно начиная с Visual Studio 2017 версии 15.5.
15.7 Это предупреждение доступно начиная с Visual Studio 2017 версии 15.7.
15.8 Это предупреждение доступно начиная с Visual Studio 2017 версии 15.8.
16.0 Это предупреждение доступно начиная с Visual Studio 2019 RTM.
16.5 Это предупреждение доступно начиная с Visual Studio 2019 версии 16.5.
16.7 Это предупреждение доступно начиная с Visual Studio 2019 версии 16.7.
16.10 Это предупреждение доступно начиная с Visual Studio 2019 версии 16.10.
16.11 Это предупреждение доступно начиная с Visual Studio 2019 версии 16.11.
17.0 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.0.
17.1 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.1.
17.2 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.2.
17.3 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.3.
17.4 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.4.
17.5 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.5.
17.6 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.6.
17.7 Это предупреждение доступно начиная с Visual Studio 2022 версии 17.7.
Perm Это предупреждение отключено, если параметр компилятора /permissive- не задан.

Предупреждения по умолчанию в более ранних версиях

Это предупреждение было отключено по умолчанию в Visual Studio 2015 версии 15.3 и включено в Visual Studio 2015 версии 15.5:

Предупреждение Message
C4768 __declspec атрибуты перед спецификацией компоновки игнорируются

Эти предупреждения были отключены по умолчанию в версиях компилятора до Visual Studio 2015:

Предупреждение Message
C4302 (уровень 2) "преобразование": усечение от типа1 до "type2"
C4311 (уровень 1) "переменная": усечение указателя с "type" на "type"
C4312 (уровень 1) "operation": преобразование из типа1 в "тип2" большего размера
C4319 (уровень 1) Оператор: ноль, расширяющий тип1 до типа2 большего размера

Это предупреждение было отключено по умолчанию в версиях компилятора до Visual Studio 2012:

Предупреждение Message
C4431 (уровень 4) отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает тип int по умолчанию

См. также

Прагма warning