务实处理警告
关于处理不必要的构建警告的文章。
引言
你是否曾编译过你精心编写的 VC++ 艺术品,然后坐下来看着编译器生成一个又一个无意义的警告?我曾经是,我敢打赌你也是。我们都见过编译器用海量的文本填满构建窗口,最后以烦人的“2个错误,52个警告”或类似数量的警告结束。在梳理完这些消息后,你通常会发现其中一些相当枯燥。它们可能在技术上是正确的,但说实话,有些警告对编程过程并没有显著影响。
那么,你能对此做什么呢?
嗯,你可以告诉编译器停止生成警告。
怎么做到的?
首先,当然,前往“项目设置”(所有乐趣都在那里)。点击“C/C++”选项卡,在那里你可以发现你可以修改“警告级别”。最有用的是级别 3。像 Chris Maunder 这样的代码专家可能还会勾选“将警告视为错误”复选框,但这只适合真正硬核的程序员。你可以稍微调整一下这个设置,将其降低到“无”,然后重新构建你的项目。然后你会注意到没有发出警告。这很酷,但说实话——只有疯狂的程序员才会这样做,尤其是在发布版本上(但这是一个在老板走过来时可以玩的绝佳技巧——*“是的——当然——我的代码很干净,现在滚开,去处理我的加薪”*——只是在他走后别忘了把它调回来!)。
根据我的帮助文件(经过删节,并修正了 Microsoft™ 的拼写错误)
项目设置 |
描述 |
||
1 级 | 显示严重警告消息。这是默认设置。 | ||
2 级 | 显示比级别 1 更不严重的警告消息。 | ||
3 级 | 显示比级别 2 更不严重的警告,例如函数调用在其函数原型之前发出的警告。级别 3 是建议用于生产用途的最敏感的警告级别。 | ||
级别 4 | 显示信息性警告,在大多数情况下可以安全忽略。应偶尔使用级别 4 来提供“lint”级别的警告,不建议将其作为常规警告级别设置。 |
有趣的是,帮助文件说级别 1 是默认设置,但项目设置似乎总是从级别 3 开始(至少在我的 PC 上是这样)。
那么,这所有的一切意味着什么?嗯,这意味着你可以选择编译器的整体敏感度,以便它生成“层级”或警告。我个人偏爱级别 3,但这仍然会产生我不希望知道的各种警告,而降到级别 2 则意味着我会错过我确实想看到的警告。
#pragma warning 指令
你能做什么?如何排除你不需要的警告而保留你想要的警告?嗯,这对你来说是幸运的一天,因为 Microsoft™ 不仅提供了警告,还提供了一种关闭它们的方法——使用一个很酷的编译器指令,称为 #pragma
。
#pragma
指令与其 warning disable 选项一起使用,这可以让你告诉编译器你不想知道哪些警告(它还做了很多其他很酷的事情,但我只专注于警告这个主题)。
使用 #pragma
warning 指令来控制你的警告报告相当直接。在感兴趣的文件(头文件或 cpp 文件)中,(显然,文件顶部是一个好地方)放置以下内容。
// #pragma warning ( disable : < warning number ><WARNING number>) //示例
// #pragma warning ( disable : 4800 ) //
将禁用警告 4800(将值强制转换为 bool 'true' 或 'false'(性能警告))。
你可以通过检查构建的输出来找到警告编号。你也可以一次禁用多个警告,方法是重复上面的代码并使用不同的警告编号,或者将它们添加到一行中,用空格分隔数字,例如:
// #pragma warning (disable : wn1 wn2 wn3 <ETC>) //
(其中 wn1、wn2、wn3 是三个不同的警告编号)
示例
// #pragma warning ( disable : 4800 4705 ) //
将禁用警告 4800 和 4705。
你可以将代码的较小区域(如函数定义)用以下语句括起来:
// #pragma warning ( disable : 4800 ) void SomeFunction() { … } #pragma warning ( default : 4800 ) //
或者用于多个禁用:
// #pragma warning ( push ) #pragma warning( disable : 4705 ) #pragma warning( disable : 4706 ) #pragma warning( disable : 4707 ) void SomeFunction() { … } #pragma warning (pop) // to restore the state of the warning //
#pragma
warning 指令还可以用于其他目的,例如:
用途 |
示例 |
||
仅显示一次警告 | #pragma warning ( once : 4800 ) | ||
将警告级别(1-4)应用于 指定的警告消息。 |
#pragma warning ( 3 : 4800 ) | ||
将指定警告报告为错误 | #pragma warning ( error: 4800 ) |
结论
在某些时间和地点可以关闭警告或修改其级别。在大多数情况下,修改警告级别是否是个好主意通常非常明显,但使用此工具时要小心——并且请阅读与#pragma
指令相关的帮助文件。