以这种方式定义宏的原因是什么:
#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0)
我的意思是do{}while(0)
背后的原因是什么?当然它只会做一次,零是常数,不能以某种方式变为非零,那么为什么要使用这样的结构呢?
答案 0 :(得分:3)
它允许像
这样的东西if (condition)
test_errno(...);
使用或不使用大括号正常工作。
答案 1 :(得分:2)
在这种情况下没有充分的理由。在类似的结构中,内部语句可以让continue
和break
做有用的事情。
#define test_errno(msg) do {if (cond1) break; \
if (cond2) break; \
if (cond3) break; \
do_something_if_all_condtions_met();} while(0)