2012-02-20 6 views
2

は、私はこのコードfrom hereこのrsAssertマクロの意味は?

#if 1 
#define rsAssert(v) do {if(!(v)) LOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while(0) 
#else 
#define rsAssert(v) while(0) 
#endif 

質問を見つけた1:ここ

ここで使用されている理由do and while私は得ていないのですか?これを使う特別な理由はありますか?

質問2:

すべてのマクロでこれを行う目的は何ですか。なぜただ1人はassert()を使用しないのですか?

私はおそらく、このための正当な理由があると思います。..

答えて

2

DO /しばらくは何かに文のブロックを回すためのよく知られたトリックがあること構文的には単一のステートメントのように機能します。

if (whatever) 
    rsAssert(whatever); 
else 
    // ... 

のような場所での使用が可能ですが、ほとんどの場合、構文エラーが発生します。 に出力するのではなく、LOGEで出力を書き込むので(LOGEがそうしない限り)、これはassertのようにプログラムを中断しないようです。

+0

assert()と言って+1するとプログラムが中止され、このマクロは.. !!! –

3

「ループ」がここに覆われている間、DOは/そこだ理由についてのあなたの最初の質問:What's the use of do while(0) when we define a macro?

2番目の質問への答えは可能性がありコードの作成者がもっとうまく答えてくれましたが、デフォルトのものではなくアサーションが失敗したときに、独自のロギングシステムを使いたいと思っています。

+0

oh ... !!そのようなことは経験によってのみ学ぶことができます... !!! –

0

としては前に何度も尋ね、DO-whileループを使用している理由は、糖衣構文です:

// this line would be valid if a simple if was used: 
rsAssert(myAssert) 

// with a do-while, however, this is now invalid: 
rsAssert(myAssert) 

// so, that means you have to add the ';' to make it look like a function call: 
rsAssert(myAssert);