为什么断言被定义为(void)0?

时间:2016-03-31 09:23:37

标签: c++ c-preprocessor noop

为什么  #define assert(expression) ((void)0), 而不是  #define assert(expression) 在发布模式下使用?(严格来说,定义NDEBUG时)

我听说有一些原因,但我已经忘记了。

2 个答案:

答案 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