我在阅读Windows Research Kernel (WRK) 1.2中的源代码时遇到了这个预处理器定义:
#define assert(exp) ((void) 0)
这段代码有什么作用?为什么要定义?
答案 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)