Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C4800有任何现实价值吗? 微软C++编译器中的C48警告,如这里所描述的:_C++_Clang - Fatal编程技术网

C4800有任何现实价值吗? 微软C++编译器中的C48警告,如这里所描述的:

C4800有任何现实价值吗? 微软C++编译器中的C48警告,如这里所描述的:,c++,clang,C++,Clang,使此代码: // C4800.cpp // compile with: /W3 int main() { int i = 0; // try.. // bool i = 0; bool j = i; // C4800 j++; } 抛出C4800警告:“类型”:强制值bool'true'或'false'(性能警告) 微软似乎认为它相当重要,并将其作为3级警告,然而Clang显然认为它不重要,因为它在最高警告级别Weverything没有任何抱怨 是否有人会提出任何现实世

使此代码:

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

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

  bool j = i;   // C4800
  j++;
}
抛出C4800警告:“类型”:强制值bool'true'或'false'(性能警告)

微软似乎认为它相当重要,并将其作为3级警告,然而Clang显然认为它不重要,因为它在最高警告级别Weverything没有任何抱怨


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

基本上,这只是警告您,您正在将某些其他整数类型转换为
bool
,而这种转换并不是完全免费的

大多数情况下(至少在我看来)都是警告您将
bool
s与其他整数类型混合在一起,这不仅会导致性能的轻微降低,还可能表明代码中存在一些混乱。查看问题中的代码:

  int i = 0;

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

  bool j = i;   // C4800
  j++;
…我们所拥有的看起来像是以前定义的
j
类型为
int
的某些代码的不完整转换。
j
的定义已经编辑过了,所以现在它的类型是
bool
,但是我们仍然从
int
给它赋值,并且(更糟糕的是)在它上面使用一个后增量,如果
j
有类型
int
,这两种定义都是有意义的,但是
j
有类型
bool

因此,问题是,我们是否真正想要通过比较结果来分配
j
boolj=(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.

阅读措辞:“性能警告”。它只是警告您,这可能比您预期的要慢一些/更贵。性能下降也是一个错误:)您能想到一个现实世界中的案例,其中您有一个不确定的性能下降,该警告会指出这一点吗?如果您还没有发现,您可能会感兴趣。第一个答案似乎表明“性能警告”不再是警告想要指出的内容。这种转换通常不需要导致性能下降,在许多情况下可能是不可操作的,因为实现不需要将
bool
表示为一或零。只有当您将值转换回int或比较
bool
s时,才会出现钳制值的要求,这应该是非常罕见的。正如警告消息所告诉您的,这不是关于潜在的错误,而是一个性能警告。