我有一个变量id
,其类型可能因平台而异。在几个地方,现有代码(我无法更改)将 设置id
为“负”值,例如
id = -ETIMEDOUT;
在某些平台上,id
可能已签名;在其他人身上,它可能是未签名的。我想测试一下是否id
设置为-ETIMEDOUT
. 当id
未签名时,下面的天真尝试会巧妙地失败:
if(id == -ETIMEDOUT)
我如何简明地测试这种情况?
我有一个变量id
,其类型可能因平台而异。在几个地方,现有代码(我无法更改)将 设置id
为“负”值,例如
id = -ETIMEDOUT;
在某些平台上,id
可能已签名;在其他人身上,它可能是未签名的。我想测试一下是否id
设置为-ETIMEDOUT
. 当id
未签名时,下面的天真尝试会巧妙地失败:
if(id == -ETIMEDOUT)
我如何简明地测试这种情况?
@jlahd 发布了一个很好的答案。我想提供一个替代方案。
if (id == (typeof(id)) -ETIMEDOUT)
我认为这会做类似的事情,但它有一个问题。它不在 C 标准中,是 GCC 扩展。
你可以在这里阅读更多关于它的信息
@rici 评论的逐字引用:
由于您可能知道一些 typedef 可以作为 id 的类型,因此您可能可以不使用 typeof 来执行此操作,尽管这样更简洁。但是,应该是
(typeof(id))(-ETIMEDOUT)
(-ETIMEDOUT 周围的括号只是装饰性的,但一元减号是必需的。)或者,以下内容应该非常万无一失:
if (-id == ETIMEDOUT)
因为如果 id 被签名,那显然是有效的;如果 id 是无符号的,则一元减号具有明确定义的行为。
尝试这个:
id += ETIMEDOUT;
if(id == 0) { /* timed out */ }
id -= ETIMEDOUT; /* if you need to keep id untouched */