sha*_*oth 3 c++ language-agnostic compiler-construction compiler-warnings visual-c++
这个问题不是特定于C++,只是使用C++作为例子.
一个普遍的观点是"将所有警告视为错误"(如/WXVisual C++选项)是好的,因为警告是一个等待发生的错误(顺便说一下,链接的线程充满了"我的目标为零警告"语句).
到目前为止,我见过的唯一反驳是某些第三方代码在没有警告的情况下无法编译.
好吧,让我们在这个问题的持续时间假装编译器有一些方法暂时禁用某些代码中的警告(如Visual C++中的这个东西):
#pragma warning(push)
#pragma warning(disable:X)
#include <ThirdParty.h>
#pragma warning(pop)
Run Code Online (Sandbox Code Playgroud)
然后第三方代码不再是问题.
假设我们完全控制所有代码(没有第三方或我们可以仅在第三方代码中禁用警告),不将警告视为错误的原因是什么?
因为有时你比编译器知道得更好.
它不一定经常使用现代编译器,但有时你需要在规范之外略微做一些事情或者对类型有点棘手,在这种特殊情况下它是安全的,但不正确.这会引起警告,因为从技术上讲,它通常在某些时候通常是错误的,并且编译器会在您出错时告诉您.
它似乎归结为编译器通常最了解,但并不总是看到整个画面或知道你的意思.有时候警告不是错误,不应该被视为一个错误.
当你偏离标准使用时,比如挂钩函数并在内存中重写代码,不准确的警告会变得更加常见.编辑导入表或模块结构可能涉及一些可能看起来有点搞笑的指针算法,因此您会收到警告.
另一种可能的情况是,当您使用非标准功能时,编译器会发出警告.例如,在MSVC10中,这个:
enum TypedEnum : int32_t
{
...
};
Run Code Online (Sandbox Code Playgroud)
将给出非标准的扩展警告.当您编译到编译器时完全有效的代码,但仍会触发警告(我相信在第4级).现在C++ 11中的许多功能以前都是作为特定于编译器的功能实现的(将完全安全,完全有效,仍然是一个警告).
另一个发出警告的安全案例是强制一个值bool,如:
bool FlagSet(FlagType flags) { return (flags & desired); }
Run Code Online (Sandbox Code Playgroud)
这给出了性能警告.如果您知道自己想要它,并且不会导致性能损失,则警告无效但仍然存在.
现在,这个是粗略的,因为你可以很容易地围绕它进行编码,但这带来了另一个观点:有时候有两种不同的方法可以做一些具有相同结果,速度和可靠性的方法,但是有一种方法不太可读,另一个则不太正确.您可以选择清洁代码而不是正确的代码并发出警告.
在其他情况下,警告可能会出现潜在问题.例如,MSVC C4683的描述字面上说"在......时谨慎行事"这是一个经典意义上的警告,可能会发生一些不好的事情.如果您知道自己在做什么,则不适用.
其中大多数都有某种替代代码样式或编译器提示来禁用警告,但那些没有可能需要它关闭.
就个人而言,我发现发出警告然后修复它们有助于摆脱大多数小错误(错别字,一个接一个,那种东西).但是,有些地方编译器不喜欢必须以某种特定方式完成的事情,而这就是警告错误的地方.
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |