来自C:
中的assert.h文件#define assert(expr) (__ASSERT_VOID_CAST (0))
我想知道是什么(__ASSERT_VOID_CAST(0))?我试图找到它的实现,但无法找到任何地方。
答案 0 :(得分:4)
好吧,__ASSERT_VOID_CAST
将是某个地方的另一个宏,当断言被“关闭”时,它将扩展为等同于
((void) 0)
这是一种获得void
表达式的方法。在较早的实现中,assert()
只是扩展为空字符串,但是void-expression将允许您使用逗号运算符将其转换为表达式,如:
while(assert(n > 0), k/n > 10) { ... }
答案 1 :(得分:2)
在我的特定系统的assert.h中,它说:
#if defined __cplusplus && __GNUC_PREREQ (2,95)
# define __ASSERT_VOID_CAST static_cast<void>
#else
# define __ASSERT_VOID_CAST (void)
#endif
所以它是一个无效的转换,并且使用它的原因是当NDEBUG设置为true时避免关于未命中值的警告。
答案 2 :(得分:1)
从assert.h
开始,高出assert
(linux,kubuntu)定义的几行:
#if defined __cplusplus && __GNUC_PREREQ (2,95)
# define __ASSERT_VOID_CAST static_cast<void>
#else
# define __ASSERT_VOID_CAST (void)
#endif