为什么宏以这种方式宣布?

时间:2013-06-28 00:52:38

标签: c++ c macros c-preprocessor errno

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

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

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

2 个答案:

答案 0 :(得分:3)

它允许像

这样的东西
if (condition) 
   test_errno(...);

使用或不使用大括号正常工作。

答案 1 :(得分:2)

在这种情况下没有充分的理由。在类似的结构中,内部语句可以让continuebreak做有用的事情。

#define test_errno(msg) do {if (cond1) break;   \
                            if (cond2) break;   \
                            if (cond3) break;   \
               do_something_if_all_condtions_met();} while(0)