我檢討,其中assert
宏在非調試配置擴展這樣的代碼庫:這個無操作while循環用於斷言宏的原因是什麼?
#define assert(what) while(0)((void)1)
,我不完全得到。顯然,我們的目標是要有一個無操作。那麼爲什麼不擴展到一個空字符串?
#define assert(what)
這個無操作循環的原因是什麼?
我檢討,其中assert
宏在非調試配置擴展這樣的代碼庫:這個無操作while循環用於斷言宏的原因是什麼?
#define assert(what) while(0)((void)1)
,我不完全得到。顯然,我們的目標是要有一個無操作。那麼爲什麼不擴展到一個空字符串?
#define assert(what)
這個無操作循環的原因是什麼?
最有可能避免編譯器警告。檢查此代碼是否引發約一個空聲明警告:
if (foo);
如果確實如此,那麼你要在釋放模式爲下面的代碼相同的警告?
if (foo) assert(what);
C99(其是相關的C++ 11)也說assert
膨脹 「到空隙表達」。 IIRC,儘管空格後面跟一個分號是一個表達式語句,但單獨的空格不是表達式。很好的老BNF語法。
順便說一下,assert
的這個定義不符合標準。 C89和C99都表示,當NDEBUG
定義,則斷言被定義爲:
#define assert(ignore) ((void)0)
我不知道作者是否認爲這是一個重要的要求,但程序例如可以將字符串化宏擴展和期望一個特定的結果。
吞噬分號,最有可能的。無論是否需要 - 我認爲這不會有太大的改變,但同時它也不會傷害任何東西。