考虑在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(禁用: 4800)暗示“我的代码很好,编译器是一个屁股”。同意?
注意 - 我已经看到了关于C4800的各种讨论,谈论将爆炸分配给bools,或者将一个带有大薯条的汉堡组合(拿着洋葱)放到一个bool上,并想知道为什么会有奇怪的结果。我找不到一个关于什么似乎是一个更简单的问题的明确答案......这可能只是在C4800上发挥作用。
答案 0 :(得分:3)
通常,此消息是由将int变量分配给bool变量
引起的
TRUE
和BOOL
是整数,而不是bool。
您还可以检查(point1 == point2) != 0
或使用!!(point1 == point2)
修改强>
!!操作只是将结果转换为bool,因为它是双重否定,您将收到相同的结果。
答案 1 :(得分:0)
实际上你不会使用ASSERT(point1 == point2)吗?如果点相等则明确重载CPoint类上的运算符以返回非零,如果不相等则返回0。着名的ASSERT宏让我失望,但如果你看一下ASSERT宏如何扩展它几乎类似于在你的代码中添加== TRUE。看看this link on msdn。请注意显式声明不直接对两个CPoint对象使用相等运算符的示例代码。我同意你的代码看起来最正确,但这就是我们喜欢C ++的原因。啊...
答案 2 :(得分:0)
现在满足我的答案是:
在内置类型上,operator ==返回bool(根据C ++标准的要求)。
对于CPoint和Microsoft的许多其他类型,operator ==返回Microsoft的BOOL,它是对int的typedef。
所以......第一个const bool赋值行试图将一个int赋给一个const bool,从而产生C4800。
第二个const bool赋值行将int与值TRUE进行比较,其值为typedef为1(假设编译器为int),因此int == int比较的结果是bool。这将被分配给const bool而不会发出警告。
至于屏幕上最好看的东西,#pragma是丑陋而且不必要的。如果你不喜欢额外!= 0的外观,那么试试这个:
#define ISTRUE( x ) ( (x) != 0 )
const bool point1And3Identical( ISTRUE( point1 == point2 ) ); // no warning
从语义和语法上来说,这似乎是一种更好的方法来完善代码。你可以悄悄地将ISTRUE()的#define塞进一个头文件中,使它看起来更漂亮。