为什么
#define assert(expression) ((void)0)
, 而不是
#define assert(expression)
在发布模式下使用?(严格来说,当定义了 NDEBUG 时)
我听说有一些原因,但我忘记了。
为什么
#define assert(expression) ((void)0)
, 而不是
#define assert(expression)
在发布模式下使用?(严格来说,当定义了 NDEBUG 时)
我听说有一些原因,但我忘记了。
((void)0)
定义assert(expression)
什么都不做。
使用它的主要原因是#define assert(expression)
允许assert(expression)
在没有分号的情况下进行编译,但如果宏定义为((void)0)
((void)0)
使用 in的原因empty macros
是让它们表现得像一个函数,从某种意义上说,您需要;
在末尾指定分号
例如:
#define assert1(expression) (void)0
assert(1) // compile error, missing ;
#define assert2(expression)
assert(1) // works