2

考虑这是在 MS Visual Studio 2005(可能还有其他)中编译的:

CPoint point1( 1, 2 );
CPoint point2( 3, 4 );
const bool point1And2Identical( point1 == point2 );            // C4800 warning
const bool point1And2TheSame( ( point1 == point2 ) == TRUE );  // no warning

什么……?MSVC 编译器是不是脑死了?据我所知,TRUE 是#defined 为 1,没有任何类型信息。那么这两条线之间有什么不同呢?在这两种情况下,括号内的表达式类型肯定是相同的吗?[这部分问题现在在下面的评论中得到了令人满意的回答]

就个人而言,我认为通过使用 == TRUE 选项来避免警告是丑陋的(尽管比 != 0 替代方案更丑陋,尽管更严格正确),最好使用 #pragma warning( disable:4800 )暗示“我的代码很好,编译器是个混蛋”。同意?

注意 - 我已经看到关于 C4800 的各种讨论,讨论将整数分配给布尔值,或者将带有大薯条(拿着洋葱)的汉堡组合投射到布尔值,并想知道为什么会有奇怪的结果。对于一个看起来简单得多的问题,我找不到明确的答案……总的来说,这可能只是 C4800 的亮点。

4

3 回答 3

3

看看这个

通常,此消息是由将 int 变量分配给 bool 变量引起的

TRUE并且BOOL是整数,而不是布尔值。

您还可以检查是否(point1 == point2) != 0或使用!!(point1 == point2)

编辑

这 !!操作只是将结果转换为布尔值,并且由于它是双重否定的,因此您将收到相同的结果。

之前在这里这里都对此进行过讨论。

于 2012-06-27T02:37:38.597 回答
0

实际上你不会使用 ASSERT(point1 == point2) 吗?CPoint 类上的运算符显式重载,如果点相等则返回非零值,否则返回 0。著名的 ASSERT 宏让我很生气,但是如果你看看 ASSERT 宏是如何扩展的,它几乎类似于在代码中添加上面的 == TRUE。在 msdn 上查看此链接。请注意示例代码明确声明不直接对两个 CPoint 对象使用相等运算符。我同意您的代码看起来最正确,但这就是我们喜欢 C++ 的原因。啊...

于 2012-06-27T02:34:52.013 回答
0

现在让我满意的答案是:

在内置类型上,运算符 == 返回 bool(根据 C++ 标准的要求)。

对于 CPoint 和许多其他 Microsoft 类型,operator == 返回 Microsoft 的 BOOL,它是 typedef'd 到一个 int。

所以...第一个 const bool 分配行尝试将一个 int 分配给一个 const bool,从而导致 C4800。

第二个 const bool 赋值行将一个 int 与值 TRUE 进行比较,该值的类型定义为 1(编译器假定为一个 int),因此 int == int 比较的结果是一个布尔值。这会在没有警告的情况下分配给 const bool。

至于屏幕上看起来最好的东西,#pragma 是丑陋且不必要的。如果你不喜欢额外的 != 0 的外观,那么试试这个:

#define ISTRUE( x )  ( (x) != 0 )

const bool point1And3Identical( ISTRUE( point1 == point2 ) );    // no warning

从语义和句法上看,这似乎是美化代码的更好方法。您可以悄悄地将 ISTRUE() 的#define 放入头文件中,使其看起来更漂亮。

于 2012-06-27T03:13:30.513 回答