一:do{...}while(0)在定义宏时的作用。其实就是能够让你定义的宏按照你期望的方式执行而没有语法或逻辑错误,无论这个宏是在if判断里面使用还是放在其他别的地方使用。
1.在后面要加分号,使调用如同函数,例如
1 #define DELETE_POINTER(p) \ 3 do { \ 5 if(NULL != p) \ 7 delete p; \ 9 p = NULL; \ 11 } while(0)
调用:
1 int a = 0; 3 int * p = &a; 5 DELETE_POINTER(p);
2.当放在if中使用时
1 #define FUN() \ 2 fun1(); \ 3 fun2();
这个宏的意思是,当调用FUN()宏时,同时调用fun1()和fun2(),但是如果这个宏在调用的时候是放在if判断判断下面的,那么
1 if(a > 0) 2 FUN();
展开后变成
1 if(a > 0) 3 fun1(); 5 fun2();
这样就变成无论a是否大于零,那么fun2()都会被执行。
而如果用do while(0)代替,那么就能够按照实际期望的那样被执行.
3.当放在if else中使用时
1 #define PRINT(a) \ 2 if(a) \ 3 dosomething;
如果应用在下面的场景中,那么
1 bool a = 1; 2 bool b = 1; 3 if(b) 4 PRINT(a); 5 else 6 dootherthings;
宏定义展开后
1 bool a = 1; 2 bool b = 1; 3 if(b) 4 if(a) 5 dosomething; 6 else 7 dootherthing;
这样之后else成了和if(a)配对了。
二:do{...}while(0)可以替换goto语句
1 int function() 2 { 3 somestruct * p = malloc(...); 4 dosomething; 5 if(error) 6 { 7 goto ERROR; 8 } 9 ERROR: 10 free(p); 11 return 0; 12 }
可以用do while(0)替换上面的goto语句
1 int function() 2 { 3 somestruct * p = malloc(...); 4 do 5 { 6 dosomething; 7 if(error) 8 { 9 break; 10 } 11 dootherthing; 12 } 13 while(0); 14 free(p); 15 return 0; 16 }