什么是(__ASSERT_VOID_CAST(0))?

时间:2009-11-08 09:24:45

标签: c macros

来自C:

中的assert.h文件
#define assert(expr)        (__ASSERT_VOID_CAST (0))

我想知道是什么(__ASSERT_VOID_CAST(0))?我试图找到它的实现,但无法找到任何地方。

3 个答案:

答案 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