10

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

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

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

4

3 回答 3

16

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

据推测,正在使用的环境不支持 ANSI C断言语句,或者程序员没有意识到可以通过定义 NDEBUG 来禁用它。

于 2009-05-20T03:31:13.360 回答
8

为了扩展bdonlan所说的内容,宏不扩展为空的原因是因为如果确实如此,则类似于:

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

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

于 2009-05-20T11:44:43.157 回答
0

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))

于 2009-09-08T08:18:39.897 回答