宏定义中的do{…}while(0);
我们都知道do while循环,但是在宏定义中常常会出现do{…}while(0);的用法,这样的循环不是只执行一次吗?不用do while也可以实现相同的功能呀,那么为什么要使用do{…}while(0);呢?
我们先来分析几个例子:
#define fun(x) func1(x);func2(x)
if (true)
fun(x);
上述代码会展开成:
if (true)
func1(x);
func2(x);
这和我们宏定义的意图不一样,因为我们想要在if语句里面执行func1和func2,而现在执行了func1。
你可能会问,这样在宏里面加上大括号{}不就行了吗?我们再来看看下面的例子:
#define fun(x) {func1(x);func2(x);}
if (true)
fun(x);
else
retrun 0;
上述代码会展开成:
if (true){
func1(x);
func2(x);
};
else
return 0;
我们可以看到if…else…语句出现了语法错误。
将宏定义改为do{…}while(0);的形式:
#define fun(x) do{func1(x);func2(x);}while(0);
if (true)
fun(x);
else
return 0;
上述代码会展开成:
if (true)
do{
func1(x);
func2(x);
}while(0);
else
return 0;
上述展开的代码无论从语法上还是逻辑上都没有错误了。总的来说,在宏定义中使用do{…}while(0);是为了在宏定义中使用多个语句块而不会受大括号和分号的影响。