编译器支持默认关闭的警告(因大多数开发人员认为它们没有用处而关闭)。 在某些情况下,这些警告与样式选择或旧代码中的常用习语相关。 其他警告与使用相应语言的 Microsoft 扩展相关。 某些警告会指明程序员经常做出错误假设(这可能会导致意外或未定义的行为)的区域。 如果启用所有这些警告,则其中一些警告可能会在库标头中多次出现。 C 运行时库和 C++ 标准库不会在警告级别
/W4
发出警告。
启用默认关闭的警告
可使用以下选项之一来启用一般情况下默认关闭的警告:
#pragma warning(default :
warning_number
)
指定的警告 (warning_number) 在其默认级别启用。 该警告的文档包含该警告的默认级别。
#pragma warning(
warning_level
:
warning_number
)
指定的警告 (warning_number) 在指定的级别 (warning_level) 启用。
/Wall
/Wall
将启用默认情况下禁用的所有警告。 如果使用此选项,则可以使用
/wd
选项关闭单个警告。
/wL
nnnn
此选项在 L 级别启用警告 nnnn。
默认关闭的警告
Visual Studio 2015 及更高版本
Visual Studio 2015 和更高版本中默认会关闭以下警告:
Message
C5220(级别 4)
“member”: 具有可变限定类型的非静态数据成员不再意味着
编译器生成的 copy/move 构造函数和 copy/move 赋值运算符不简单
16.7
C5233(级别 4)
未使用显式 lambda 捕获“identifier”
16.10
C5240(级别 4)
“attribute-name”: 在此语法位置将忽略属性
16.10
C5243(级别 1)
“type-name”: 由于 ABI 限制,使用不完整的类“class-name”可能会导致潜在的一个定义规则冲突
16.10
C5245(级别 4)
“function”: 已删除具有内部链接的未引用函数
C5246(级别 1)
“member”: 子对象的初始化应括在大括号内
16.10
C5247(级别 1)
节“section-name”是为 C++ 动态初始化保留的。 手动创建节会干扰 C++ 动态初始化,并可能导致未定义的行为
16.11
C5248(级别 1)
节“section-name”是为 C++ 动态初始化保留的。 手动放入节中的变量可能已优化,并且其相对于编译器生成的动态初始化表达式的顺序未指定
16.11
Visual Studio 2022 及更高版本
Visual Studio 2022 及更高版本中默认关闭以下警告:
Message
14.1
从 Visual Studio 2015 Update 1 开始提供此警告。
14.3
从 Visual Studio 2015 Update 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 开始提供此警告。
Perm
除非设置了
/permissive-
编译器选项,否则会关闭此警告。
早期版本默认关闭的警告
以下警告在 Visual Studio 2015 版本 15.3 中默认已关闭,在 Visual Studio 2015 版本 15.5 中已启用:
Message