我喜欢(布尔)的方式较多,但它会产生警告。 我如何摆脱掉的警告?
我有这样的代码:
bool something_else = 0;
void switcher(int val = -1){
if(val != -1){
something_else = (bool)val;
}else{
something_else ^= 1;
}
}
如果我只是做其他人一样和使用“!” 或者获得某种隐藏的警告信息使用(布尔)时? 或者是“!” 实际上比(布尔)更快?
我想用(布尔),所以我不得不隐藏警告,但如何?
编辑:Visual Studio 2008中我使用的,对不起,我忘了告诉。
编辑2:警告消息warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
而谈到就行something_else = (bool)val;
和上线something_else = val;
但是,不就行了something_else = !!val;
问题是,我希望它尊重,我想将它转化成布尔值。 我不想隐藏所有的布尔警告,因为有时他们救了我的屁股。
其他方式:
switch (val) {
case -1: something_else = !something_else; break;
case 0: something_else = false; break;
default: something_else = true; break;
}
您应该使用运营商和构建特定的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
类型适当必将提高你进一步与其他开发商合作。
您可以隐含转换明确与(val != 0)
该行为将是相同的强制转换为布尔,或!!
,但让你的意图明确针对的类型val
。
我与VC ++的警告:
main.cpp中:5:警告C4800:'诠释:强制值bool“真”或“假”(性能警告)
你可以解决它,如果你不“逼”的价值为布尔,但分配一个值,该值已经是布尔值:
something_else = val != 0;
(不要问我为什么这不愧是一个警告 - 该通知您的严重问题(/ W3警告)间海事组织,那将是好了很多,有一个特殊的标志来打开此类可疑值的警告。)
但是,什么是大局观:切换或使用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;
}
}
我想用(布尔),所以我不得不隐藏警告,但如何?
你为什么不征询编译器上的警告文档? http://msdn.microsoft.com/en-us/library/b6801kcy(VS.71).aspx
当被分配或强迫bool类型未bool的一个值时产生该警告。 典型地,该消息被通过分配INT变量,其中int变量只包含值为真和假的,并且可以重新声明为bool类型为bool变量引起的。 如果您不能重写表达式使用bool类型,那么你可以添加“!= 0”来表达,这给表达bool类型 。 铸造表达式bool类型不会禁用警告,这是由设计。
我不认为它在这种情况下,但你总是可以#pragra警告禁用 。
#pragra warning disable # [, #]
这也可能是基于编译器警告级别( http://msdn.microsoft.com/en-us/library/b6801kcy(VS.80).aspx )。