2011-01-06 12 views
3

コードには、関数の戻り状態をチェックする頻繁な繰り返し行があります。私はこのためのマクロを定義すると考える:このマクロチェックの状態に問題があり、失敗した場合には返信します。

#define RETURN_IF_FAILED(x) { int stat = (x); if (FAILED(stat)) return stat; } 

パラメータxは、関数の呼び出しも可能性があるため、ローカル変数です。

私は、マクロを使用するという奇妙なアーティファクトがあり、私はそれほど熟練していないことを知っています。このマクロに問題があるかどうか尋ねたいと思います。ありがとう。

(としてくださいは、例外を使用することをお勧めしません - 私はこのスタイルを自分自身を憎むが、それはそれはここで行うの方法です)

答えて

7

を私はそれを少し変更したいと思います。このようなdo{} while(0)とそれを囲む:

#define RETURN_IF_FAILED(x) do { int stat = (x); if (FAILED(stat)) return stat; } while(0) 

今、あなたはこのマクロを使用することができ、このように:あなたのバージョンで

if (SomeCondition) 
    RETURN_IF_FAILED(x); //<--- note the "usual" semicolon! 
else 
{ 
    //some code 
} 

、このコードはまったく不可能です。マクロの後に;があなたのバージョンで問題を引き起こすでしょう!

+0

ありがとう、これは ';'のためです。私はこのトリックについてお読みしました... – davka

+0

@davka:まさに。 ';'が問題です! – Nawaz

+0

なぜdo {'と'} while(0) 'ですか? '{'と '}'は十分でしょうか? – peoro

関連する問題