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

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

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

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

它定义了表达式assert(nothing)什么都不做。

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

为了扩展bdonlan所说的内容,宏不扩展空的原因是因为如果它做了,那么类似于:

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

将在发布模式下编译,但不在调试模式下编译。 它((void) 0)而不是0是为了防止“无效语句”警告(或者MSVC调用它们)。

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

来自newlib中断言手册:

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