3

以这种方式定义宏的原因是什么:

#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0)

我的意思是背后的原因是什么do{}while(0)?当然它只会做一次,零是恒定的,不能以某种方式变为非零,那么为什么要使用这种结构呢?

4

2 回答 2

3

它允许像

if (condition) 
   test_errno(...);

带或不带大括号都能正常工作。

于 2013-06-28T00:54:31.250 回答
2

在这种情况下没有充分的理由。在类似的构造中,内部的语句拥有continuebreak做有用的事情是很有用的。

#define test_errno(msg) do {if (cond1) break;   \
                            if (cond2) break;   \
                            if (cond3) break;   \
               do_something_if_all_condtions_met();} while(0)
于 2013-06-28T00:57:08.137 回答