断言宏的解释

use*_*735 8 c++

我无法评论答案本身,所以:关于使用逗号来防止需要括号对

 #define MY_ASSERT(expr) ((expr) || (debugbreak(), 0))
Run Code Online (Sandbox Code Playgroud)

这里debugbreak()返回void,但我们仍然希望将0作为右值.

(debugbreak(),0)如何返回0?我知道debugbreak()的返回值被丢弃并且返回0,但是debugbreak会生成异常,那么以后如何评估任何内容呢?我想我的问题可以推广到任何类似的二元运算符,其中被评估的第一部分退出程序.

sha*_*oth 1

如果断言触发,则不会计算任何内容,但两个表达式都必须具有正确的返回类型,否则该宏将中断编译。

  • +1 换句话说,你不能用“void”进行逻辑或,但可以用“int”。 (2认同)