强制值为布尔值:(bool)发出警告,!!犯规

时间:2010-03-13 18:33:11

标签: c++ visual-studio-2008 boolean

我更喜欢(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}上}}

问题是,我希望它尊重我想将其转换为布尔值。我不想隐藏所有布尔警告,因为有时他们保存了我的屁股。

6 个答案:

答案 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;
}