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

Questions about Macro Definitions in C/C++ for a specific expression

本文关键字:C++ 宏定义 问题 表达式      更新时间:2023-10-16

我试图理解一些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

有人能告诉我如何解释吗?

从评论到问题:

我不确定什么((void)((expr)?0:(Assert::failedAssert(),0))。我知道它调用了failedAssert函数,但没有调用太多其他函数。

事实是,三元运算符要求两个操作数的类型相同(您可以根据自己的情况随意忽略此规则的少数例外)
尽管您没有为Assert::failedAssert()提供声明,但我强烈怀疑它的返回类型是void。逗号运算符使int可以作为表达式的类型:

(Assert::failedAssert(), 0)

因此,三元运算符的两个表达式的类型是int,并且代码可以愉快地编译。

第一个(void)只是起到抑制警告的作用。