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