我更喜欢(bool),但它会产生警告。我如何摆脱警告?
我的代码如下:
bool something_else = 0;
void switcher(int val = -1){
if(val != -1){
something_else = (bool)val;
}else{
something_else ^= 1;
}
}
我应该像其他人一样使用'!!'或者在使用(bool)时以某种方式隐藏警告信息?或者是'!!'实际上比(布尔)更快?
我想使用(bool)所以我必须隐藏警告,但是如何?
编辑:我正在使用的Visual Studio 2008,抱歉,我忘了告诉。
编辑2 警告讯息为warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
它出现在something_else = (bool)val;
行上something_else = val;
但不在行{{1}上}}
问题是,我希望它尊重我想将其转换为布尔值。我不想隐藏所有布尔警告,因为有时他们保存了我的屁股。
答案 0 :(得分:14)
您应该使用特定于bool
类型的运算符和结构:
bool something_else = false;
void switcher(int val = -1)
{
if(val == -1) // val is -1 by default so THIS part is likely to execute
something_else = !something_else;
else
something_else = (val != 0);
}
如果您的昵称不言自明,那么编写其他人也会理解的代码可能是有意义的。如果遇到这个特殊问题,适当使用bool
类型肯定会改善您与其他开发者的进一步合作。
答案 1 :(得分:7)
您可以使用(val != 0)
明确隐含转化。行为将与强制转换为bool或!!
相同,但会使val
的类型明确显示。
答案 2 :(得分:2)
我收到VC ++的警告:
main.cpp:5:警告C4800:'int': 强迫价值bool'真'或 'false'(表现警告)
如果你没有将值“强制”为bool,你可以解决它,但是指定一个已经是布尔值的值:
something_else = val != 0;
(不要问我为什么这应该是一个警告 - 在告诉你严重问题的警告中(/ W3).IMO,如果有一个特殊的标志来打开这样可疑的警告会好得多价值。)
但更大的是什么:切换或使用val(其中-1表示“不使用”)?
怎么样:
bool something_else = 0;
void switcher(bool val, bool use_val = false){
if(use_val){
something_else = val;
}else{
something_else = !something_else;
}
}
或者使用tribool(之前从未使用过)::)
#include <boost/logic/tribool.hpp>
bool something_else = false;
void switcher(boost::tribool val = boost::indeterminate){
if(!indeterminate(val)){
something_else = val;
}else{
something_else = !something_else;
}
}
答案 3 :(得分:2)
我想使用(bool)所以我必须隐藏警告,但是如何?
为什么不查阅编译器有关警告的文档? http://msdn.microsoft.com/en-us/library/b6801kcy(VS.71).aspx
值时会生成此警告 那不是布尔分配或 强迫进入类型bool。通常情况下, 此消息是由分配引起的 int变量到bool变量where int变量只包含值 真假,也可能 重新宣布为类型bool。 如果你 无法重写要使用的表达式 键入bool,然后你可以添加“!= 0” 表达式,给出了 表达类型bool 。铸造 表达式bool不会 禁用警告,即 设计。
答案 4 :(得分:0)
在这种情况下我不建议,但您可以随时#pragra warning disable。
#pragra warning disable # [, #]
它也可能基于编译器警告级别(http://msdn.microsoft.com/en-us/library/b6801kcy(VS.80).aspx)。
答案 5 :(得分:-4)
switch (val) {
case -1: something_else = !something_else; break;
case 0: something_else = false; break;
default: something_else = true; break;
}