为什么默认情况下C4062 Visual C ++警告会关闭?

时间:2011-10-27 13:54:20

标签: c++ visual-c++ compiler-construction switch-statement compiler-warnings

根据MSDN,Visual C ++可以在

时发出C4062 warning
  • 和枚举用于switch
  • 该枚举的至少一个元素没有标签,
  • default:
  • 中没有switch标签

现在对我来说这种情况当然值得警告 - 这个元素很有可能被错误处理。如果不需要为某些元素执行任何操作 - 开发人员可以提供空casedefault

默认关闭此警告的原因是什么?

4 个答案:

答案 0 :(得分:1)

有些人(我把自己包括在内)喜欢在他们建造的时候看到'0警告'。如果你只是处理一些案例,那么添加一个空案例可能没问题,但是如果你正在使用一个输入库,它会给你一个显示哪个键已关闭的枚举,你真的想要200多个空案例吗?你不处理的钥匙?

当然,您可以说只添加一个空的默认大小写,但是:

  • 在上述情况下,它并没有真正具有语义意义
  • 现在你只是邀请C4061(这一切都在哪里结束?)

因此,如果我默认收到这些警告,那么它真的会设置我的OCD

答案 1 :(得分:0)

如果默认情况下此警告为ON,则enum可能无法始终保持可扩展状态,而无需编辑现有(已在工作的)代码。 e.g。

// (c) 2009
// header.h
enum E { a, b, c };
...
// legacy.cpp
switch(e)
{
case a:  ...
case b:  ...
case c:  ...
}

假设2年后开发人员仅编辑header.h。实施文件经过了充分测试,未经更改(legacy.cpp

// (c) 2011
// header.h
enum E { a, b, c, d, e };  // added 'd','e'

由于强制性警告,legacy.cpp可能会在未处理de的地方充斥警告,这可能是不可取的。

答案 2 :(得分:0)

这些警告可能是根据具体情况启用的。尝试使用/Wall编译C ++项目会产生数千条来自Microsoft自己标题的警告。

现在,您正在尝试调试大量代码,其中您怀疑某处遗漏了case语句(或者您想排除此假设)。然后启用C4062。

如果你看起来很好,所有这些禁用的警告都是非常迂腐的,但它们可以用来追踪晦涩的错误。你真的想启用C4264吗?

答案 3 :(得分:0)

人们出于不同的原因使用枚举。

很多其他人(显然包括微软)将使用它们的意图更少审查。它们只是一个命名值,它们的分组不是很有趣。在他们的辩护中,他们有很多理由可以覆盖。

像GuyCook的例子有一些边缘案例,没有人会对收到警告感到高兴。他是对的,没有人想看那个垃圾。在这种情况下,我已将处理代码放在其自己的cpp文件中,因此如果不更改标头,则不会重新编译它。我希望有一种更方便的方法来解决这个问题,但我认为没有。

我很欣赏语言(C#/ Java?),因为他们能够忽略具有注释的警告的特定实例。

你被遗漏所迷惑的事实意味着你可能正在以他们在设计中最有意义的方式使用它们。我个人认为枚举应该与关于耦合和凝聚力的类一样受到同样的审查。如果有人更改枚举,则应检查代码。如果有人更改了您继承的类的界面,您会想知道这个,不是吗?

他们不会 以这种方式使用它们。枚举只是一种工具,有些人更喜欢将它用作东西的同义词。 :)

相关问题