首页 > 解决方案 > #define abc (0-0) 是什么意思

问题描述

最近在写代码的时候遇到了一个问题。代码是这样的-

if ((var >= min) && (var <= max))
{
    return true;
}

min 和 max 都是之前已经定义的宏,而 var 是无符号整数。我将 min 的值更改为 0,这会产生警告,unsigned integer >= 0 will always be true。首先我想直接删除第一个条件来处理警告,但我的前辈拒绝这样做,因为代码不仅用于我正在工作的项目,还用于其他项目,所以也许 min 的值可能是在其他项目中高于 0。他是这样建议我的——

#define min (0-0)

这解决了问题,没有产生警告。但我不明白为什么它会起作用?我请我的前辈解释,但他说我自己找出来。我在谷歌上搜索,但没有找到任何熟悉的东西。那么有人可以向我解释上面发生了什么吗?先感谢您。

标签: c++macros

解决方案


答:因为编译器似乎不检查表达式的结果。

只是要知道:这是一个问题。编译器是正确的 - unsigned int 不能小于 0。无论你传递给这个函数,这个比较总是正确的。因为你在工作,所以按照别人告诉你的去做,但请记住——你是对的,应该删除它,因为它在你当前的实现中没有意义。

var 必须更改为 long long ,然后一切都会好起来的!问题就在那里!这是一个时间问题,有人将负值传递给该函数并且会失败。它将对将有符号值传递给期望无符号的函数发出警告,并且该人将弃用它以使其没有警告...


推荐阅读