如下所述的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会指出这会让它值得启用吗?
答案 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.