关于特定表达式的C / C ++宏定义问题

时间:2017-10-16 17:39:49

标签: c++ c-preprocessor ternary-operator

我正在尝试理解一些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

有谁能告诉我如何解释这个?

1 个答案:

答案 0 :(得分:0)

从评论到问题:

  

我不确定是什么((void)((expr)?0 :( Assert :: failedAssert(),0)))。我知道它调用函数failedAssert但不是很多。

事实上,三元运算符要求两个操作数都属于同一类型(您可以自由忽略此规则的少数例外情况)。
即使您没有为Assert::failedAssert()提供声明,我强烈怀疑其返回类型为void。逗号运算符可以使int作为表达式的类型:

(Assert::failedAssert(), 0)

因此三元运算符的两个表达式的类型是int,并且代码很乐意编译。

第一个(void)仅用于抑制警告。