什么是这个rsAssert宏的含义?

时间:2012-02-20 17:21:06

标签: c++ c macros

我找到了这段代码from here

#if 1
#define rsAssert(v) do {if(!(v)) LOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while(0)
#else
#define rsAssert(v) while(0)
#endif

问题1:

这里我不明白为什么do and while在这里使用?使用这个有什么特别的理由吗?

问题2:

在宏中执行此操作的目的是什么。为什么只有一个人不使用assert()

我想也许是有正当理由的。

3 个答案:

答案 0 :(得分:3)

这里有关于为什么有一个do / while“循环”的第一个问题:What's the use of do while(0) when we define a macro?

第二个问题的答案可以由代码的作者更好地回答,但我想他们想要在断言失败时使用自己的日志记录系统,而不是默认的。

答案 1 :(得分:2)

do / while是一个众所周知的技巧,用于将语句块转换为语法上像单个语句一样的语句。它允许在以下地方使用:

if (whatever)
    rsAssert(whatever);
else
    // ...

然而,在这种情况下,大多数替代方案会产生语法错误。

至于为什么要使用它:因为它用LOGE写输出而不是打印到stderr,并且(除非LOGE这样做)这似乎不会中止像{{{{{{ 1}}会。

答案 2 :(得分:0)

如前所述,使用do-while循环的原因是语法糖:

// this line would be valid if a simple if was used:
rsAssert(myAssert)

// with a do-while, however, this is now invalid:
rsAssert(myAssert)

// so, that means you have to add the ';' to make it look like a function call:
rsAssert(myAssert);