我在阅读Windows Research Kernel (WRK) 1.2中的源代码时遇到了这个预处理器定义:
#define assert(exp) ((void) 0)
这段代码有什么作用?为什么要定义它?
我在阅读Windows Research Kernel (WRK) 1.2中的源代码时遇到了这个预处理器定义:
#define assert(exp) ((void) 0)
这段代码有什么作用?为什么要定义它?
它定义了表达式 assert( anything ) 什么都不做。
据推测,正在使用的环境不支持 ANSI C断言语句,或者程序员没有意识到可以通过定义 NDEBUG 来禁用它。
为了扩展bdonlan所说的内容,宏不扩展为空的原因是因为如果确实如此,则类似于:
assert(something) // oops, missed the semi-colon
assert(another_thing);
会在发布模式下编译,但不会在调试模式下编译。它的原因((void) 0)
不仅仅是0
为了防止“无效声明”警告(或任何 MSVC 调用它们)。
Just to add, this is the definition of assert in newlib too, when NDEBUG
is defined as a preprocessor directive. Newlib is the open source C library that is used on Cygwin and embedded systems.
From the assert manual in newlib:
The macro is defined to permit you to turn off all uses of assert at compile time by defining
NDEBUG
as a preprocessor variable. If you do this, the assert macro expands to(void(0))