4

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

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

4

2 回答 2

3

((void)0)定义assert(expression)什么都不做。
使用它的主要原因是#define assert(expression)允许assert(expression)在没有分号的情况下进行编译,但如果宏定义为((void)0)

于 2016-03-31T09:27:46.373 回答
2

((void)0)使用 in的原因empty macros是让它们表现得像一个函数,从某种意义上说,您需要;在末尾指定分号

例如:

#define assert1(expression) (void)0
     assert(1) // compile error, missing ;

#define assert2(expression) 
     assert(1) // works
于 2016-03-31T09:41:42.647 回答