2012-02-20 74 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:

是什麼做的這一切在宏的目的。爲什麼只有一個不使用assert()

我想也許有這個正當的理由..

回答

2

的DO /雖然是轉向語句塊弄成一個衆所周知的伎倆,語法上就像一個單獨的語句。它允許在如下地方使用:

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

然而,在這種情況下,大多數替代方案會產生語法錯誤。

至於爲什麼使用它在所有的:因爲它的輸出與LOGE,而不是印刷寫入stderr,和(除非LOGE這樣做),這似乎並沒有終止程序一樣assert意志。

+0

+1表示assert()會中止程序,並且此宏不會.. !!! – 2012-02-20 17:33:48

3

你爲什麼那裏,而「循環」這裏涉及的一個DO /第一個問題:What's the use of do while(0) when we define a macro?

回答第二個問題可能是代碼的作者更好地回答了這個問題,但我想他們希望在斷言失敗時使用他們自己的日誌記錄系統,而不是默認的日誌系統。

+0

哦...... !!這樣的事情只能通過經驗學習...... !!! – 2012-02-20 17:32:37

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);