“#define assert(exp)((void)0)”是做什么的?

时间:2009-05-20 03:28:59

标签: c assert

我在阅读Windows Research Kernel (WRK) 1.2中的源代码时遇到了这个预处理器定义:

#define assert(exp) ((void) 0)

这段代码有什么作用?为什么要定义?

3 个答案:

答案 0 :(得分:16)

它将表达式assert(任何)定义为什么都不做。

据推测,正在使用的环境不支持ANSI C assert语句,或者程序员不知道可以通过定义NDEBUG来禁用它。

答案 1 :(得分:8)

要扩展 bdonlan 所说的内容,宏不会展开为空的原因是因为如果确实如此,那么就像:

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

将在发布模式下编译,但不在调试模式下编译。它是((void) 0)而不仅仅是0的原因是为了防止“无效声明”警告(或MSVC称之为的任何警告)。

答案 2 :(得分:0)

只是添加,当NDEBUG被定义为预处理器指令时,这也是 newlib assert 的定义。 Newlib是在Cygwin和嵌入式系统上使用的开源C库。

来自 newlib 中的断言手册:

  

定义宏以允许您关闭断言的所有用法   通过将NDEBUG定义为预处理器变量来编译时间。如果你这样做,   断言宏扩展为 (void(0))