2011-11-01 54 views
2

我檢討,其中assert宏在非調試配置擴展這樣的代碼庫:這個無操作while循環用於斷言宏的原因是什麼?

#define assert(what) while(0)((void)1) 

,我不完全得到。顯然,我們的目標是要有一個無操作。那麼爲什麼不擴展到一個空字符串?

#define assert(what) 

這個無操作循環的原因是什麼?

回答

3

最有可能避免編譯器警告。檢查此代碼是否引發約一個空聲明警告:

if (foo); 

如果確實如此,那麼你要在釋放模式爲下面的代碼相同的警告?

if (foo) assert(what); 

C99(其是相關的C++ 11)也說assert膨脹 「到空隙表達」。 IIRC,儘管空格後面跟一個分號是一個表達式語句,但單獨的空格不是表達式。很好的老BNF語法。

順便說一下,assert的這個定義不符合標準。 C89和C99都表示,當NDEBUG定義,則斷言被定義爲:

#define assert(ignore) ((void)0) 

我不知道作者是否認爲這是一個重要的要求,但程序例如可以將字符串化宏擴展和期望一個特定的結果。

2

吞噬分號,最有可能的。無論是否需要 - 我認爲這不會有太大的改變,但同時它也不會傷害任何東西。

相關問題