“#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
被定义为预处理器指令时,这也是newlib中assert的定义。 Newlib是在Cygwin和嵌入式系统上使用的开源C库。
来自newlib中的断言手册:
定义宏以允许您通过将
NDEBUG
定义为预处理器变量来在编译时关闭断言的所有使用。 如果这样做, 断言宏扩展为(void(0))