我想知道为什么 _wassert 函数被包装在 (..,0)
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
最佳答案
_wassert
函数在断言失败时被调用。这将:
- 打印断言失败。
- 调用
abort
(或exit
或类似的函数来结束执行)。
因此它不会返回并被声明为一个 void 函数(正如 T.C. 在评论中提到的)。 (它必须声明为 void,否则编译器会提示它没有返回值)。
那么当它在表达式中使用时 test || _wassert(...)
编译器会提示,因为它没有进行类型检查。 ||
需要两种数字类型。所以解决方案是让右边的表达式返回一个 int(即使由于 abort
而永远不会返回),为此他们使用逗号运算符。
关于c - 为什么 `_wassert` 包裹在 `(..,0)` 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663216/