如下所述的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++;
}
Run Code Online (Sandbox Code Playgroud)
抛出C4800警告:"'type':强制值为bool'true'或'false'(性能警告)"
微软似乎认为这是一个相当重要的,并将其作为Level3警告,但Clang显然认为不是这样,因为对它的最大警告水平没有任何投诉.
是否有任何人可以提出的现实世界的错误,C4800会指出这会让它值得启用吗?
基本上,这只是警告您已将某些其他整数类型转换为 a bool,并且此转换并非完全免费。
它主要存在(至少在我看来)是为了警告您将bools 与其他整数类型混合,这不仅会导致性能略有下降,而且还可能表明代码中存在一些混乱。查看问题中的代码:
int i = 0;
// try..
// bool i = 0;
bool j = i; // C4800
j++;
Run Code Online (Sandbox Code Playgroud)
...我们所拥有的看起来j像是之前定义为类型的某些代码的不完整转换int。的定义j已被编辑,因此它现在的类型为bool,但我们仍然从 中为它分配一个值int,并且(更糟糕的是)在其上使用后增量,如果j有类型int,这两者都会有意义,但实际上没有t 具有j类型bool。
所以,问题是我们是否真的想用j比较的结果来分配什么:或者可能是一个更完整的转换,也bool 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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |