为什么 `_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
函数。这将:
- 打印断言失败。
- 调用
abort
(或exit
或类似的函数来结束执行)。
因此它不会 return 并且被声明为无效函数(如 T.C 在评论中提到的)。 (它必须声明为 void 否则编译器会抱怨它没有 return 值)。
因此,当它在表达式 test || _wassert(...)
中使用时,编译器会报错,因为它没有进行类型检查。 ||
需要两种数字类型。所以解决方案是让右边的表达式 return 成为一个 int(即使它永远不会 return 由于 abort
),并且他们使用逗号运算符来做到这一点。
我想知道为什么 _wassert 函数包含在 (..,0)
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
断言失败时调用_wassert
函数。这将:
- 打印断言失败。
- 调用
abort
(或exit
或类似的函数来结束执行)。
因此它不会 return 并且被声明为无效函数(如 T.C 在评论中提到的)。 (它必须声明为 void 否则编译器会抱怨它没有 return 值)。
因此,当它在表达式 test || _wassert(...)
中使用时,编译器会报错,因为它没有进行类型检查。 ||
需要两种数字类型。所以解决方案是让右边的表达式 return 成为一个 int(即使它永远不会 return 由于 abort
),并且他们使用逗号运算符来做到这一点。