3

idプラットフォームごとに型が異なる変数があります。いくつかの場所で、既存のコード (私は変更できません) がidを「負の」値に設定します。

id = -ETIMEDOUT;

一部のプラットフォームでidは、署名されている場合があります。他のものでは、署名されていない可能性があります。idが に設定されているかどうかをテストしたい-ETIMEDOUTidが署名されていない場合、以下の単純な試みは微妙に失敗します。

if(id == -ETIMEDOUT)

この状態を簡潔にテストするにはどうすればよいですか?

4

2 に答える 2

2

これを試して:

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

@jlahd が良い回答を投稿しました。私は代替案を提供したいと思います。

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

これも同じようにできると思いますが、問題があります。これは C 標準にはなく、GCC 拡張です。

ここでもう少し詳しく読むことができます

@riciのコメントの逐語的な引用:

id の型として機能する typedef をおそらく知っているので、おそらく typeof なしでこれを行うことができますが、その方がきれいです。ただし、

(typeof(id))(-ETIMEDOUT) 

( -ETIMEDOUT を囲む括弧は単なる表面的なものですが、単項のマイナスが必要です。) あるいは、次のようにすれば間違いなく簡単に実行できます。

if (-id == ETIMEDOUT)

id が署名されている場合、それは明らかに機能します。id が符号なしの場合、単項マイナスの動作は明確に定義されています。

于 2013-09-10T22:35:48.937 に答える