3

我有一个变量id,其类型可能因平台而异。在几个地方,现有代码(我无法更改)将 设置id为“负”值,例如

id = -ETIMEDOUT;

在某些平台上,id可能已签名;在其他人身上,它可能是未签名的。我想测试一下是否id设置为-ETIMEDOUT. 当id未签名时,下面的天真尝试会巧妙地失败:

if(id == -ETIMEDOUT)

我如何简明地测试这种情况?

4

2 回答 2

2

@jlahd 发布了一个很好的答案。我想提供一个替代方案。

if (id == (typeof(id)) -ETIMEDOUT)

我认为这会做类似的事情,但它有一个问题。它不在 C 标准中,是 GCC 扩展。

你可以在这里阅读更多关于它的信息

@rici 评论的逐字引用:

由于您可能知道一些 typedef 可以作为 id 的类型,因此您可能可以不使用 typeof 来执行此操作,尽管这样更简洁。但是,应该是

(typeof(id))(-ETIMEDOUT) 

(-ETIMEDOUT 周围的括号只是装饰性的,但一元减号是必需的。)或者,以下内容应该非常万无一失:

if (-id == ETIMEDOUT)

因为如果 id 被签名,那显然是有效的;如果 id 是无符号的,则一元减号具有明确定义的行为。

于 2013-09-10T22:35:48.937 回答
2

尝试这个:

id += ETIMEDOUT;
if(id == 0) { /* timed out */ }
id -= ETIMEDOUT; /* if you need to keep id untouched */
于 2013-09-10T22:24:25.453 回答