C4800有没有真正的世界价值?

时间:2016-01-27 21:37:05

标签: c++ clang

如下所述的microsoft c ++编译器中的C4800警告:

https://msdn.microsoft.com/en-us/library/b6801kcy.aspx

制作此代码:

// C4800.cpp
// compile with: /W3
int main() {
  int i = 0;

 // try..
 // bool i = 0;

  bool j = i;   // C4800
  j++;
}

抛出C4800警告:"'键入' :强迫价值飙升' true'或者' false' (绩效警告)"

微软似乎认为它非常重要,并将其作为Level3警告,但是Clang显然认为它不是,因为它没有任何关于它的最高警告级别的投诉。

有人可以提出任何现实世界的错误C4800会指出这会让它值得启用吗?

1 个答案:

答案 0 :(得分:3)

基本上,这只是警告您,您已将其他整数类型转换为bool,并且此转换并非完全免费。

它主要存在(至少在我看到的情况下)警告你将bool与其他整数类型混合在一起,这不仅会导致性能的轻微下降,而且也可能表明代码中存在一些混淆。查看问题中的代码:

  int i = 0;

 // try..
 // bool i = 0;

  bool j = i;   // C4800
  j++;

...我们看起来像,就像以前将j定义为类型int的某些代码的不完整转换一样。 j的定义已经过编辑,现在它的类型为bool,但我们仍然会为其分配int的值,并且(更糟)使用如果j的类型为int,但j类型为bool,则两者都有意义。

所以,问题在于我们是否真的想要为j分配比较结果:bool j = (i != 0);或者更完整的转化可以将i变成bool 1}}以及:

bool i = false;

// ...
bool j = i; // no warning

j = true;   // cleaner way of producing the same result as the post-increment.