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

标签 c visual-studio assertion

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

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

最佳答案

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

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

因此它不会返回并被声明为一个 void 函数(正如 T.C. 在评论中提到的)。 (它必须声明为 void,否则编译器会提示它没有返回值)。

那么当它在表达式中使用时 test || _wassert(...) 编译器会提示,因为它没有进行类型检查。 || 需要两种数字类型。所以解决方案是让右边的表达式返回一个 int(即使由于 abort 而永远不会返回),为此他们使用逗号运算符。

关于c - 为什么 `_wassert` 包裹在 `(..,0)` 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663216/

相关文章:

c - 为什么这会继续只返回单链表的一个节点?

c - 在 fprintf : error fault access violation at address 0x000000 , 中读取地址 0x00

c - 如何同步接收串口数据?

C#:访问添加到项目文件夹的图像

c# - Visual Studio 'Test Explorer' 输出位于何处?是保存的文件吗?

node.js - Task Runner Explorer 窗口在我的 Gulpfile.js 下有 "failed to load"并且没有列出任何构建过程

c - 我的代码给出了 Linux 上的环境变量

java - List<String> @Test 从最后一个索引中删除 null

java - 无法使用 ColdFusion 验证 SAML 断言

julia - 在 Julia 中断言对角化向量时,是什么导致 `AssertionError` ?