其他分享
首页 > 其他分享> > Visual C警告C4800,为什么它只在return语句上触发?

Visual C警告C4800,为什么它只在return语句上触发?

作者:互联网

我刚刚安装了Windows SDK v7.1(MSVC 10.0)并运行了我的代码(几乎)完全警告级别(W3,默认为qmake的CONFIG = warn_on)并且对于警告C4800感到惊讶:’type’:强制值为bool ‘true’或’false'(性能警告)

在以下代码中,stream是std :: istream,token是std :: string.

// in some function returning bool
return (stream >> token) // triggers warning c4800:
                         // '(void *)': forcing value to bool 'true' or 'false' (performance warning)`
// somewhere else
if( stream >> token ) // does not trigger warning c4800

这里发生了什么?我甚至不知道为什么首先触发警告.我认为第一段代码已经返回了一个bool.

我明白这是挑剔,警告甚至不应该存在,但它是我的代码中唯一一个MSVC / W3和gcc的-Wall -pedantic之间的代码,所以我想知道:)

小更新:我知道警告旨在让你知道你正在假设int-> bool转换,但是1)为什么你甚至仍然使用bool(主要是== typedef int)和2)为什么if if( 2)不将2转换为true或false,我认为这是谓词的全部概念,无论是真还是假.

解决方法:

What is going on here? I don’t even get why the warning is triggered in the first place. I thought the first bit of code already returned a bool anyways.

> Streams有一个隐式转换运算符,它返回一个void *. (这是safe bool idiom的一个版本.它是这样做的,因为void *编译的上下文比bool少,因此隐式转换可能会导致不需要的上下文更少.)[1]
> Streams’运算符>>()返回对其左操作数的引用 – 流.那就是你可以链接输入操作:strm>> value1>> value2被执行为((strm>> value1)>> value2).

现在,当你说if(strm>> value),strm>>执行值并返回流.为了将它放入if语句,执行隐式转换为void *,然后检查该指针是否为NULL.
这与if(ptr)没有区别,if语句隐式将其条件转换为bool,但编译器永远不会对此发出警告,因为条件不是bool是如此常见.

回归,这是不同的.如果要返回某种类型,通常返回的表达式应为该类型. VC的警告很烦人,对我来说,在100次中有99次这是多余的.但剩下的1%(从来没有一个性能问题,BTW;我认为这个警告很愚蠢)让我很高兴警告就在那里.

此警告的解决方法是

return 0 != <expression>

其中< expression>是你认为应该被视为布尔值的任何东西.

[1] ISTR Stroustrup写一个操作符bool()会静默编译的地方,如果你搞砸了运算符:ostrm>> 5; (注意>>而不是<<)会编译正常,但默默地做错了. (它将布尔值转换为整数并右移5次,然后丢弃该值.)

标签:c,visual-c,compiler-warnings
来源: https://codeday.me/bug/20190726/1545806.html