Предупреждения компилятора, выключенные по умолчанию
Компилятор поддерживает предупреждения, отключенные по умолчанию, так как большинство разработчиков не находят их полезными. В некоторых случаях они предупреждают о стилистическом выборе или о распространенных идиомах в более старом коде. Другие предупреждения относятся к использованию расширения Майкрософт на языке. Некоторые предупреждения указывают на область, в которой программисты часто делают неправильные предположения, что может привести к неожиданному или неопределенному поведению. Если все эти предупреждения включены, некоторые из них могут отображаться несколько раз в заголовках библиотеки. Библиотеки среды выполнения C и стандартные библиотеки C++ предназначены для выдачи предупреждений только на уровне /W4
предупреждений.
Включение предупреждений, отключенных по умолчанию
Вы можете включить предупреждения, которые обычно отключены по умолчанию, с помощью одного из следующих параметров:
#pragma warning(default :
warning_number)
Указанное предупреждение (warning_number) включено на уровне по умолчанию. Документация по предупреждениям содержит уровень предупреждения по умолчанию.
#pragma warning(
:
warning_level warning_number)
Указанное предупреждение (warning_number) включено на указанном уровне (warning_level).
-
/Wall
включает все предупреждения, в том числе предупреждения, отключенные по умолчанию. При использовании этого параметра можно отключить отдельные предупреждения с помощью/wd
этого параметра. -
Этот параметр включает предупреждение nnnn на уровне L.
Предупреждения, отключенные по умолчанию
Visual Studio 2015 и более поздних версий
Следующие предупреждения отключены по умолчанию в Visual Studio 2015 и более поздних версиях:
Предупреждение | Сообщение |
---|---|
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) | Объявление пересылки перечисления должно иметь базовый тип (предполагаемая 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 и более поздних версиях:
Предупреждение | Сообщение |
---|---|
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 и более поздних версиях:
Предупреждение | Сообщение |
---|---|
C5052 (уровень 3) | Ключевое слово "keyword-name" было введено в версии C++ и требует использования параметра командной строки option 16.1 |
C5204 (уровень 3) | Класс с виртуальными функциями имеет не-виртуальный деструктор. 16.5 |
C5214 (уровень 4) | применение "keyword" к операнду с переменным квалифицированным типом устарело в 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 и более поздних версиях:
Предупреждение | Сообщение |
---|---|
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:
Предупреждение | Сообщение |
---|---|
C4768 | __declspec атрибуты перед спецификацией компоновки игнорируются |
Эти предупреждения были отключены по умолчанию в версиях компилятора до Visual Studio 2015:
Предупреждение | Сообщение |
---|---|
C4302 (уровень 2) | "преобразование": усечение от типа1 до "type2" |
C4311 (уровень 1) | "переменная": усечение указателя с "type" на "type" |
C4312 (уровень 1) | "operation": преобразование из типа1 в "тип2" большего размера |
C4319 (уровень 1) | Оператор: ноль, расширяющий тип1 до типа2 большего размера |
Это предупреждение было отключено по умолчанию в версиях компилятора до Visual Studio 2012:
Предупреждение | Сообщение |
---|---|
C4431 (уровень 4) | отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает тип int по умолчанию |