2012-02-20 107 views
2

我发现这个代码from here这个rsAssert宏的含义是什么?

#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()

我想也许有这个正当的理由..

回答

2

的DO /虽然是转向语句块弄成一个众所周知的伎俩,语法上就像一个单独的语句。它允许在如下地方使用:

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

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

至于为什么使用它在所有的:因为它的输出与LOGE,而不是印刷写入stderr,和(除非LOGE这样做),这似乎并没有终止程序一样assert意志。

+0

+1表示assert()会中止程序,并且此宏不会.. !!! – 2012-02-20 17:33:48

3

你为什么那里,而“循环”这里涉及的一个DO /第一个问题:What's the use of do while(0) when we define a macro?

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

+0

哦...... !!这样的事情只能通过经验学习...... !!! – 2012-02-20 17:32:37

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);