我有一个变量id
,其类型可能因平台而异。在一些地方,现有代码(我无法更改)将id
设置为“负”值,例如
id = -ETIMEDOUT;
在某些平台上,可能会签署id
;在其他人身上,它可能是未签名的。我想测试id
是否设置为-ETIMEDOUT
。当id
未签名时,下面的天真尝试会巧妙地失败:
if(id == -ETIMEDOUT)
我如何简明扼要地测试这种情况?
答案 0 :(得分:2)
试试这个:
id += ETIMEDOUT;
if(id == 0) { /* timed out */ }
id -= ETIMEDOUT; /* if you need to keep id untouched */
答案 1 :(得分:2)
if (id == (typeof(id)) -ETIMEDOUT)
我认为这会有类似的但是它有问题。它不在C标准中,是GCC扩展。
您可以阅读更多相关信息here
@ rici评论的逐字引用:
因为你可能知道一些作为id类型的typedef,所以你可以在没有typeof的情况下做到这一点,尽管那更干净。但是,它应该是
(typeof(id))(-ETIMEDOUT)
(-ETIMEDOUT周围的括号只是化妆品,但需要一元减号。)或者,以下应该是非常简单的:
if (-id == ETIMEDOUT)
因为如果id被签名,那显然有效;如果id是无符号的,则一元减号具有明确定义的行为。