【问题标题】:Does C4800 have any real world value?C4800 有任何现实价值吗?
【发布时间】:2016-01-27 21:37:04
【问题描述】:

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 警告:“'type' : force value to bool 'true' or 'false' (performance warning)”

Microsoft 似乎认为它相当重要,并将其作为 3 级警告,但 Clang 显然认为并非如此,因为在 -Weverything,它的最高警告级别,对此的投诉为零。

C4800 是否存在任何现实世界中的错误,有人会指出它值得启用它?

【问题讨论】:

  • 阅读措辞:“性能警告”。这只是警告您,这可能比您预期的要慢/贵一些。
  • 性能下降也是一个错误 :) 你能想到一个现实世界的案例,即这个警告会指出你有一个不必要的性能下降吗?
  • 如果您还没有找到它,this question 可能会让您感兴趣。第一个答案似乎表明“性能警告”不再是警告要指出的内容了。
  • 这种转换通常不需要导致性能下降,在许多情况下它可能是空操作,因为实现不需要将bool 表示为一或零。仅当您将其转换回 int 或比较 bools 时才会出现钳位值的要求 - 这应该很少见。
  • 正如警告信息告诉你的,这不是潜在的错误,而是性能警告。

标签: c++ clang


【解决方案1】:

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

大多数情况下(至少在我看来)警告您将 bools 与其他整数类型混合,这不仅会导致性能略有下降,而且还可能表明代码中存在一些混淆.查看问题中的代码:

  int i = 0;

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

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

...我们所拥有的看起来类似于之前将j 定义为int 类型的某些代码的不完全转换。 j 的定义已被编辑,现在它的类型为 bool,但我们仍然从 int 为其分配一个值,并且(更糟糕的是)在其上使用后增量,这两者都会使感觉 j 是否有 int 类型,但真的不知道 jbool 类型。

所以,问题是我们是否真正想通过比较结果分配jbool j = (i != 0);,或者更完整的转换,将i也变成bool

bool i = false;

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

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

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多