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

Posted

技术标签:

【中文标题】将值强制为布尔值:(bool) 发出警告,!!不【英文标题】:Forcing value to boolean: (bool) makes warning, !! doesnt 【发布时间】:2010-03-13 18:33:11 【问题描述】:

我更喜欢 (bool) 方式,但它会产生警告。如何摆脱警告?

我有这样的代码:

bool something_else = 0;

void switcher(int val = -1)
    if(val != -1)
        something_else = (bool)val;
    else
        something_else ^= 1;
    

我是否应该像其他人一样使用“!!”或者让它在使用 (bool) 时以某种方式隐藏警告消息?或者是“!!”实际上比 (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; 但不是就行了something_else = !!val;

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

【问题讨论】:

使用(bool) 显式转换时没有收到警告;你能发布更多细节吗?您正在谈论的警告和您正在使用的编译器会有所帮助。 你从哪里得到警告?我会说应该是^= 1 产生警告,而您似乎在谈论(bool)。这没有任何意义。再次,重新检查您的案例中导致警告的原因。 @Johannes:呃……众所周知,正确的做法是reinterpret_cast<bool&>(some_int) :) reinterpret_cast 是最糟糕的方法。最好的是 !!,其次是 != 0(反之亦然,取决于您的口味) @Pavel:我认为 reinterpret_cast 评论是个玩笑。最好的方法是 !=0 ,这实际上是 Visual Studio 文档所要求的形式。 【参考方案1】:

您应该使用特定于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 类型肯定会促进您与其他开发人员的进一步合作。

【讨论】:

我不想让代码看起来很奇怪。如果你知道什么,请检查我的编辑? @Newbie:所以你的意思是你问题中的代码并不奇怪?好吧,祝你好运!否则,我就是不知道谁的代码很奇怪。【参考方案2】:

您可以使用(val != 0) 显式地进行隐含转换。该行为与转换为 bool 或 !! 的行为相同,但会针对 val 的类型明确表示您的意图。

【讨论】:

为什么投反对票?这是编译器必须生成以正确处理强制转换的代码,分支依赖是它警告您的内容。【参考方案3】:

我收到 VC++ 警告:

main.cpp:5: 警告 C4800: 'int' : 强制值 bool 'true' 或 'false'(性能警告)

如果您不将值“强制”为布尔值,但分配一个已经是布尔值的值,您可以解决它:

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;
    

【讨论】:

所以没有办法解决具体的警告?只完全禁用布尔警告?我不希望那样,因为它有时有用的警告。我也不想因为那个警告而让我的代码变得更复杂...... 是的,那不会发生,我不想增加这种事情的复杂性。 我不认为这会增加任何“复杂性”,即使我自己不是这些警告的忠实粉丝(例如,tribool 示例产生 87 个关于添加填充和删除内联函数的各种警告 /墙)。【参考方案4】:

我想使用 (bool),所以我必须隐藏警告,但是如何?

为什么不参考编译器的警告文档呢? http://msdn.microsoft.com/en-us/library/b6801kcy(VS.71).aspx

当一个值产生这个警告 不是 bool 被分配或 强制转换为 bool 类型。通常, 此消息是由分配引起的 int 变量到 bool 变量,其中 int 变量只包含值 真假,可能是 重新声明为 bool 类型。 如果你 无法重写要使用的表达式 输入 bool,然后你可以添加 "!=0" 到 表达式,它给出了 表达式类型 bool。铸造 类型为 bool 的表达式不会 禁用警告,这是由 设计。

【讨论】:

是的!= 在那种代码中对我来说毫无意义,不会使用它。我只是希望当我通过告诉“将 int 转换为 bool”将 int 转换为 bool 时有办法解决该特定警告,我明白,如果你不告诉它将它转换为 bool 来显示警告是件好事 你认为 != 0 没有 !! 的意义?这对我来说似乎很奇怪,但无论如何。警告的原因是为了转换为 bool,编译器必须在编译后的代码中插入分支指令。分支指令对性能很敏感,编译器希望您知道您不会像在大多数其他类型之间转换时那样“免费”获得转换。通过编写 != 对程序进行简单检查,就可以清楚地了解分支依赖性。【参考方案5】:

在这种情况下我不建议这样做,但你可以随时#pragra warning disable。

#pragra warning disable # [, #]

也可能基于编译器警告级别 (http://msdn.microsoft.com/en-us/library/b6801kcy(VS.80).aspx)。

【讨论】:

【参考方案6】:

另一种方式:

switch (val) 
  case -1: something_else = !something_else; break;
  case  0: something_else = false; break;
  default: something_else = true; break;

【讨论】:

你一定不知道过于复杂的代码是什么样子的。而且因为你来这里问了一个对答案完全没有兴趣的问题,我开始认为你是一个巨魔。 这不是我要寻找的答案,我想找一种方法来隐藏特定案例的警告。对不起,我不会让我的功能如此混乱。我问“我如何摆脱警告?”不是“如何编程?” 然后改变你的问题,说你想继续使用相同的代码但隐藏警告。你也有答案告诉你。但是大多数说他们想要“摆脱警告”的人意味着他们想要修复代码以便它不会产生警告,而不仅仅是告诉编译器闭嘴。还有你的“我应该这样做吗!!”表明您正在寻找最正确的方法,而不仅仅是抑制警告。嗯,“!= 0”是重写单行的最好方法,而我的switch语句是重写整个函数的最清晰的方法。 很公平,现在想想,我认为这是最好的方法

以上是关于将值强制为布尔值:(bool) 发出警告,!!不的主要内容,如果未能解决你的问题,请参考以下文章

警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

重构MFC,你使用BOOL还是bool [重复]

如何在 GCC 下强制设置“布尔”的大小

OpenCV YAML 解析布尔值

使用 Json.Net 将 int 转换为 bool [重复]

为啥这个 if 语句以非布尔值成功?