我找到了这段代码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()
?
我想也许是有正当理由的。
答案 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);