C++ 为什么将assert定义为(void)0?
为什么C++ 为什么将assert定义为(void)0?,c++,c-preprocessor,noop,C++,C Preprocessor,Noop,为什么 #定义断言(表达式)((void)0), 而不是 #定义断言(表达式) 在发布模式下使用?(严格来说,当定义NDEBUG时) 我听说有一些原因,但我忘记了。((void)0)定义断言(表达式)什么都不做。 使用它的主要原因是#define assert(expression)允许assert(expression)编译而不使用分号,但是如果宏被定义为((void)0)它将不会编译((void)0)在空宏中使用的原因是使它们像函数一样工作,您需要指定分号在末尾 例如: #define as
#定义断言(表达式)((void)0)
,
而不是
#定义断言(表达式)
在发布模式下使用?(严格来说,当定义NDEBUG时)
我听说有一些原因,但我忘记了。((void)0)
定义断言(表达式)
什么都不做。使用它的主要原因是
#define assert(expression)
允许assert(expression)
编译而不使用分号,但是如果宏被定义为((void)0)
它将不会编译((void)0)
在空宏中使用的原因是使它们像函数一样工作,您需要指定分号代码>在末尾
例如:
#define assert1(expression) (void)0
assert(1) // compile error, missing ;
#define assert2(expression)
assert(1) // works
通常有一个代码>之后,如果断言变为空,那么剩下的孤独
可能触发警告。后者允许断言(true)
(不带分号),而前者不允许。@marglisse您应该将其作为答案发布。现在,你的评论是唯一能真正回答发帖人问题的陈述。那么#define assert(expr)
有什么区别呢?