2009-05-20 72 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))

相关问题