将值强制为布尔值:(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”(性能警告)