这是一个我相信可以安全地做你想做的事的宏:
#define EXIT_CIRCULATION() \
if (1) { \
/* some statements */ \
break; \
} \
else \
do {} while (0)
if
here 与 an 匹配的事实else
意味着宏可以安全地在 another 中使用if
,并且由于该else
子句是无操作do
/语句,它提供了与在/while
中包装多行宏类似的属性。比如宏需要用分号结束,就好像它是一个普通的语句一样;忘记分号会导致语法错误。它在另一个or子句中表现得很好。do
while
if
else
对你来说最重要的是(我认为),该break
语句不会被宏吞没 - 它会打破使用宏的循环。
这是否是一个好主意完全是另一回事。许多程序员不喜欢将流控制语句隐藏在宏中(除非控制流完全在宏单元内)。
这是在行动:
#include<stdio.h>
#include<stdlib.h>
#define EXIT_CIRCULATION() \
if (1) { \
puts("done."); \
break; \
} \
else \
do {} while (0)
int main()
{
int i = 0;
for (i = 0; i < 10; ++i) {
if (i > 4)
EXIT_CIRCULATION();
else
puts("working...");
}
printf("i == %d\n", i);
return 0;
}
输出:
working...
working...
working...
working...
working...
done.
i == 5