我正在尝试理解一些C ++代码,这段代码让我感到困惑。
#ifndef NDEBUG
#define ukd_assert(expr) \
((void)((expr) ? 0 : (Assert::failedAssert(), 0)))
#else // NDEBUG
#define INSTANTIATE_ASSERT(fp)
#define ukd_assert(expr) ((void)0)
#endif // NDEBUG
有谁能告诉我如何解释这个?
答案 0 :(得分:0)
从评论到问题:
我不确定是什么((void)((expr)?0 :( Assert :: failedAssert(),0)))。我知道它调用函数failedAssert但不是很多。
事实上,三元运算符要求两个操作数都属于同一类型(您可以自由忽略此规则的少数例外情况)。
即使您没有为Assert::failedAssert()
提供声明,我强烈怀疑其返回类型为void
。逗号运算符可以使int
作为表达式的类型:
(Assert::failedAssert(), 0)
因此三元运算符的两个表达式的类型是int
,并且代码很乐意编译。
第一个(void)
仅用于抑制警告。