Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么将assert定义为(void)0?_C++_C Preprocessor_Noop - Fatal编程技术网

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)
有什么区别呢?