【问题标题】:Why is `_wassert` wrapped in `(..,0)`?为什么 `_wassert` 包裹在 `(..,0)` 中?
【发布时间】:2016-02-13 07:00:09
【问题描述】:

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

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

【问题讨论】:

  • 我猜是用来丢弃_wassert的结果值
  • @BryanChen 并使其适合作为|| 的正确操作数。 _wassert 的返回类型很可能是 void
  • 我很惊讶这个问题到目前为止只收到了 1 票 (+1)。

标签: c visual-studio assertion


【解决方案1】:

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

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

因此,它不会返回并被声明为 void 函数(正如 T.C. 在 cmets 中提到的那样)。 (它必须声明为 void 否则编译器会抱怨它没有返回值)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多