2009-05-20 75 views

回答

16

它定義表達式assert(任何東西)什麼都不做。

假設所用的環境不支持ANSI C assert語句,或者程序員不知道可以通過定義NDEBUG來禁用它。

8

要什麼bdonlan說擴展,宏不會擴展爲空的原因是因爲如果它這樣做,則是這樣的:

assert(something) // oops, missed the semi-colon 
assert(another_thing); 

將編制發佈模式而不是在調試模式。這是因爲它是((void) 0)而不是僅僅0是爲了防止「無效的聲明」警告(或任何MSVC調用它們)。

0

我想補充,這是newlib太的定義斷言,當NDEBUG定義爲預處理指令。 Newlib是在Cygwin和嵌入式系統上使用的開源C庫。

斷言手冊中newlib

的宏被定義爲允許你 關閉斷言的所有用途通過定義NDEBUG作爲預處理器變量編譯時間。如果你這樣做, 的斷言宏展開(void(0))

相關問題