如果出现';第三方代码中是否没有警告? 这个问题不是针对C++的,只是用C++的东西作为例子。 一个普遍的观点是“把所有警告当作错误”(比如 /WX VisualC++选项)是很好的,因为(BTW链接线程中满是“我的目标为零警告”语句)。

如果出现';第三方代码中是否没有警告? 这个问题不是针对C++的,只是用C++的东西作为例子。 一个普遍的观点是“把所有警告当作错误”(比如 /WX VisualC++选项)是很好的,因为(BTW链接线程中满是“我的目标为零警告”语句)。,c++,visual-c++,language-agnostic,compiler-construction,compiler-warnings,C++,Visual C++,Language Agnostic,Compiler Construction,Compiler Warnings,到目前为止,我所看到的唯一的反驳是,一些第三方代码在没有警告的情况下是无法编译的 好的,在这个问题的整个过程中,让我们假设编译器有在某些代码中临时禁用警告的方法(如Visual C++中的这种方法): #pragma警告(推送) #杂注警告(禁用:X) #包括 #布拉格警告(pop) 然后第三方代码就不再是问题了 假设我们完全控制所有代码(没有第三方或我们只能在第三方代码中禁用警告),那么不将警告视为错误的原因是什么?因为有时您比编译器更了解 现代编译器不一定经常这样做,但有时您需要做一些稍微

到目前为止,我所看到的唯一的反驳是,一些第三方代码在没有警告的情况下是无法编译的

好的,在这个问题的整个过程中,让我们假设编译器有在某些代码中临时禁用警告的方法(如Visual C++中的这种方法):

#pragma警告(推送)
#杂注警告(禁用:X)
#包括
#布拉格警告(pop)
然后第三方代码就不再是问题了


假设我们完全控制所有代码(没有第三方或我们只能在第三方代码中禁用警告),那么不将警告视为错误的原因是什么?

因为有时您比编译器更了解

现代编译器不一定经常这样做,但有时您需要做一些稍微超出规范的事情,或者对类型有点棘手,在这种特殊情况下是安全的,但并不正确。这会引起一个警告,因为从技术上讲,它通常在某些时候是错误的,而且编译器会付费告诉您什么时候可能是错误的

这似乎可以归结为编译器通常最了解情况,但并不总是了解整个情况或完全了解您的意思。有时警告不是错误,不应该被视为错误

当你偏离标准使用,比如挂接函数和在内存中重写代码时,不准确的警告变得越来越普遍。编辑导入表或模块结构可能涉及一些指针算法,这些算法看起来可能有点滑稽,因此您会收到一条警告

另一种可能的情况是,当您使用编译器发出警告的非标准特性时。例如,在MSVC10中,这:

enum TypedEnum : int32_t
{
    ... 
};
将发出非标准扩展警告。当您向编译器编码时,代码是完全有效的,但仍然会触发警告(我相信是在4级以下)。C++11中现在的许多特性以前是作为编译器特定特性实现的,它们将遵循这一点(完全安全、完全有效,仍然是一个警告)

另一个发出警告的安全案例是强制将值设置为bool,如:

bool FlagSet(FlagType flags) { return (flags & desired); }
这会发出性能警告。如果您知道您想要这样做,并且它不会导致性能下降,那么警告是无用的,但仍然存在

现在,这一个是粗略的,因为你可以很容易地围绕它进行编码,但这带来了另一点:有时可能有两种不同的方法做一些事情,具有相同的结果,速度和可靠性,但一种可读性较差,另一种则不太正确。您可以选择更干净的代码而不是正确的代码,并发出警告

在其他情况下,可能会出现警告所述的潜在问题。例如,MSVC C4683的描述字面上说“在……时要小心”,这是一个经典意义上的警告,可能会发生不好的事情。如果你知道自己在做什么,那就不适用了

其中大多数都有某种替代代码样式或编译器提示来禁用警告,但不需要关闭警告的代码样式或编译器提示可能会被关闭

就我个人而言,我发现打开警告并修复它们有助于消除大多数小错误(打字错误,一个一个,诸如此类)。然而,有些地方编译器不喜欢某些必须以特定方式完成的事情,这就是警告错误的地方

我看到了三个原因:

  • 遗留代码:接受充满警告的代码并缓慢更新以使其符合要求是一项艰巨的任务。任何修改都有引入新bug的风险。有时,潜在的好处不值得冒险
  • 无知:通常情况下,这并不是一个真正明智的决定,许多人不会摆弄编译器设置
  • 懒惰:又名,在地毯下扫荡,希望只在爱好项目上采用(我乐观,我乐观,我乐观…)
遗留代码当然是一个问题,但可以有效地处理:

  • 将遗留代码视为第三方代码(又名中国长城)
  • 改革代码,一次一个文件(对未改革的文件使用“UglyWarningDeactivator.h”),或一次一个警告(通过有选择地启用它们)
长城策略最好在测试和代码一样糟糕或者时间有限的时候使用。否则,当资源和测试信心允许时,我显然敦促您采取增量重写方法



在一个新的代码库上?没有理由。在最坏的情况下,如果您真的需要一些棘手的事情(输入puning,…),您总是可以有选择地停用相关代码区域的警告。真正伟大的是它记录了一些可疑的事情

我非常喜欢使用带有少量警告的代码库进行编译,而不是由于某些“不可协商”的警告被关闭而允许生成警告的代码激增的代码库(我不会假装这不会发生)。至少在前一种情况下,可能需要一些代码检查的区域仅通过重建就可以清楚地看到


此外,拥有致命/警告/良性这三个类别允许在不破坏构建的情况下为警告类别添加少量有用信息(请参阅)。只有致命或不致命的区别,警告列表必须更加明智。

在许多情况下,一个程序集中的更改或一种语言中的更改可能会导致用于干净编译的代码开始发出警告。在某些情况下,容忍这种行为
bool FlagSet(FlagType flags) { return (flags & desired); }