为什么 `_wassert` 包裹在 `(..,0)` 中?

Why is `_wassert` wrapped in `(..,0)`?

我想知道为什么 _wassert 函数包含在 (..,0)

    #define assert(expression) (void)(                                                       \
            (!!(expression)) ||                                                              \
            (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
        )

断言失败时调用_wassert函数。这将:

  1. 打印断言失败。
  2. 调用abort(或exit或类似的函数来结束执行)。

因此它不会 return 并且被声明为无效函数(如 T.C 在评论中提到的)。 (它必须声明为 void 否则编译器会抱怨它没有 return 值)。

因此,当它在表达式 test || _wassert(...) 中使用时,编译器会报错,因为它没有进行类型检查。 || 需要两种数字类型。所以解决方案是让右边的表达式 return 成为一个 int(即使它永远不会 return 由于 abort),并且他们使用逗号运算符来做到这一点。