【发布时间】:2020-05-09 18:18:14
【问题描述】:
这是 Visual Studio 2019 中断言宏的定义
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
_ACRTIMP void __cdecl _wassert(
_In_z_ wchar_t const* _Message,
_In_z_ wchar_t const* _File,
_In_ unsigned _Line
);
#define assert(expression) (void)( \
(!!(expression)) || \
(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
)
#endif
正如你在上面看到的,在发布版本中宏断言的定义是
#define assert(expression) ((void)0)
为什么不能只是#define assert(expression) 0?
【问题讨论】:
-
相关:Why is assert is defined as (void)0?。 (不是重复的,因为它专注于另一种选择,但将来发现这个问题的人可能会感兴趣。)
-
@JaMiT 我不相信链接问题中给出的答案。所以我决定在Visual C++ 中问同样的问题。我在那里得到了 Igor Tandetnik 的精彩回答。
-
* 耸耸肩 * Igor 确实给出了一个很好的例子。但是,您可能会注意到此页面上的某个位置(在宽浏览器中位于右侧,在窄浏览器中位于底部)现在有一个“链接”部分,其中包含指向 “为什么断言定义为 (void)0? ".我可以通过添加评论向该部分添加相关的 SO 问题。添加相关的非 SO 问题并不是那么简单。 ;)
标签: c++ c visual-studio assert