当您编写程序时,编译器将检查以确保您遵循 C++ 语言的规则(假设您已关闭编译器扩展)。
如果您所做的事情确实违反了语言规则,则在编译期间,编译器将发出错误,提供包含错误的行号以及一些有关预期内容和发现内容的文本。实际的错误可能位于该行或前一行。识别并修复错误的代码行后,您可以尝试再次编译。
在其他情况下,编译器可能会发现代码看起来可能有错误,但编译器无法确定。在这种情况下,编译器可能会选择发出警告。警告不会停止编译,而是通知程序员某些地方似乎有问题。
不要让警告堆积起来。当你遇到它们时解决它们(就像它们是错误一样)。否则,关于严重问题的警告可能会在关于非严重问题的警告中丢失。
在大多数情况下,可以通过修复警告指出的问题或通过重写生成警告的代码行以不再生成警告来解决警告。
在极少数情况下,可能需要明确告诉编译器不要为相关代码行生成特定警告。C++ 不支持执行此操作的官方方法,但许多单独的编译器(包括 Visual Studio 和 GCC)提供了解决方案(通过不可移植的 #pragma 指令)来暂时禁用警告。
提高警告级别
默认情况下,大多数编译器只会生成有关最明显问题的警告。但是,您可以要求编译器提高警告级别。
将警告级别调至最高,尤其是在学习时。它将帮助您识别可能的问题。
对于 Visual Studio 用户
要提高警告级别,请在“解决方案资源管理器”窗口中右键单击项目名称,然后选择“属性”:
在“项目”对话框中,首先确保“配置”字段设置为“所有配置”。
然后选择C/C++ > General 选项卡并将警告级别设置为Level4 (/W4):
注意:请勿选择EnableAllWarnings (/Wall),否则您将被 C++ 标准库生成的警告所淹没。
Visual Studio 默认情况下禁用签名/未签名转换警告,这些警告很有用,因此如果您使用的是 Visual Studio 2019 或更高版本,请启用这些警告:
- 在C/C++ > Command Line 选项卡中,在Another Options下,添加
/w44365
. 这告诉编译器在警告级别 4 上启用有符号/无符号转换警告(您在上面启用了该警告)。 - 从C/C++ > 外部包含选项卡中,将外部标头警告级别设置为Level3 (/external:W3)。这告诉编译器以警告级别 3(而不是 4)编译标准库标头,以便编译这些标头不会触发此警告。
“外部包含”选项卡未显示在上图中,但出现在 VS Community 2019 或更高版本中的“浏览信息”和“高级”选项卡之间。请参阅此链接,其中包含包含“外部包含”选项卡的对话框的最新照片。
对于 Code::Blocks 用户
从“设置”菜单 >“编译器”>“编译器设置”选项卡,找到并检查与-Wall、-Weffc++和-Wextra相关的选项:
然后进入其他编译器选项选项卡,将-Wconversion -Wsign-conversion添加到以下文本编辑区域:
对于 GCC/G++ 用户
将以下标志添加到命令行中:-Wall -Weffc++ -Wextra -Wconversion -Wsign-conversion
对于 VS Code用户
打开tasks.json 文件,找到“args”,然后在该部分中找到“${file}”行。
在“${file}”行上方,添加包含以下命令的新行(每行一个):
“-Wall”,
“-Weffc++”,
“-Wextra”,
“-Wconversion”,
“-Wsign-conversion”,
将警告视为错误
还可以告诉编译器将所有警告视为错误(在这种情况下,如果编译器发现任何警告,它将停止编译)。这是执行建议的好方法,即您应该修复所有警告。
启用“将警告视为错误”。这将迫使您解决导致警告的所有问题。
对于 Visual Studio 用户
要将警告视为错误,请在“解决方案资源管理器”窗口中右键单击您的项目名称,然后选择“属性”:
在“项目”对话框中,首先确保“配置”字段设置为“所有配置”。
然后选择“C/C++”>“常规”选项卡并将“将警告视为错误”设置为“是”(/WX)。
对于 Code::Blocks 用户
从“设置”菜单 >“编译器”>“其他编译器选项”选项卡,将-Werror添加到文本编辑区域:
对于 GCC/G++ 用户
将以下标志添加到命令行中:-Werror
对于 VS Code用户
在tasks.json
文件中,在“${file}”之前添加以下标志,每行一个:
"-Werror",
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-compiler-warning-and-error-levels/