5

エラー処理をサポートするマクロに取り組んでいます。

#define Try(e, call)   ( (e == OK) && ((e = call) != OK) )

if ステートメントの式として使用できます。

if (Try(err, SomeFunction(foo, bar))) {
    // Entered only if err was OK before the if-statement and SomeFunction()
    // returned a non-OK value.
}

errif ステートメントの前に既に OK でない場合、関数は呼び出されません。if ステートメントの後、errの戻り値が設定されますSomeFunction()

ここまでは順調ですね。ただし、ifステートメントなしでマクロを使用したい:

Try(err, SomeFunction(foo, bar));

この場合、GCC は次の警告を表示します。

warning: value computed is not used [-Wunused-value]

それが私の質問です。GCC がこの警告を生成しないようにマクロを書き直すにはどうすればよいでしょうか。フラグを使用して警告を無効にできることはわかっていますが (ただし、他のコードでは有効にしたままにしたい)、または結果を明示的にvoid. 次のステートメント コードでは、警告は生成されません。

(void) Try(err, SomeFunction(foo, bar));

Try()しかし、それぞれの前にvoidキャストを付けるのは理想的とは言えません。助言がありますか?

4

3 に答える 3

5

次のように三項演算子を使用できます。

( (e == OK) ? ((e = call) != OK) : (e == OK) )
于 2012-11-02T21:10:20.257 に答える
2

私はこのようなものに行きます

inline
bool notOK(int err) {
  return err != OK;
}

#define Try(e, call)   ( !notOK(e) && notOK(e = call) )

通常、コンパイラは、使用されていない関数の戻り値について文句を言いません。

デバッグの目的で、「インスタンス化」を追加する必要がある場合もあります

bool notOK(int err);

.cファイル内。

于 2012-11-02T21:11:17.963 に答える
1

ただのアイデア。

static inline int identity (int x) { return x; }
#define Try(e, call)   (identity ((e == OK) && ((e = call) != OK)))

gcc 以外のコンパイラが#define inline __inline__必要な場合があります。#define inline /*nothing*/

于 2012-11-02T21:15:28.693 に答える