用do while进行复杂的宏定义

在很多比较复杂的宏定义中,经常可以看到整个接口被一层do while(0)给包了起来

#define Foo(x) do{\
	printf("first statement\n");\
	printf("second statement\n");\
}while(0) 

这样定义的是一个非复合语句,可以确保在类似下面这种情况

if(xxx)
    Foo(x)    
else
	...        

可以顺利展开,展开后的结果被do while包了起来

if(xxx)
	do {
		printf("first statement\n");
		printf("second statement\n");
	}while(0)
else
	...  

如果没有加do while而只用一个花括号的话,宏在预处理的时候会去掉花括号直接展开成下面这种复合语句,这样就会报错了

if(xxx)
	printf("first statement\n");
	printf("second statement\n");
else
	...  

你可能感兴趣的:(C与CPP)