为什么
#define assert(expression) ((void)0)
,
而不是
#define assert(expression)
在发布模式下使用?(严格来说,定义NDEBUG时)
我听说有一些原因,但我已经忘记了。
答案 0 :(得分:2)
((void)0)
定义assert(expression)
无所作为。
使用它的主要原因是#define assert(expression)
允许assert(expression)
在没有分号的情况下进行编译,但如果将宏定义为((void)0)
答案 1 :(得分:1)
在((void)0)
中使用empty macros
的原因是,它们的行为类似于函数,因为您需要在末尾指定分号;
例如:
#define assert1(expression) (void)0
assert(1) // compile error, missing ;
#define assert2(expression)
assert(1) // works