在C++中,在使用宏的时候,建议使用do { xxxx;} while(0)的写法
好处主要有以下:
1、可以将其当作一个整体,避免当宏是有多行组成时被拆分
比如
#define Foo(x) Action1();Action2();
而在比如 if (x > 3) Foo(x);调用时。
根据宏替换后,就是 if(x>3) Action1();Action2();
此时只有Action1()在if的逻辑分支之前,而Action2()是不在if的逻辑分支之下的。
而 #define Foo(x) {Action1(); Action2();} 则可以解决上面的问题。
2、 既然用{}可以解决block的问题,为什么还需要使用do while呢
看第二种场景
还是上面的宏: #define Foo(x) {Action1(); Action2();}
比如我们使用场景为:
if {x > 3} Foo(x);
else .....;
此时宏替换后就是:
if(x>3) {Action1(); Action2()};
else .....;
注意此时上面的这个分号是会导致编译错误的。
而将宏写成如下形式:
#define Foo(x) do{Action1(); Action2();}while(0)
还是上面的调用场景:
宏替换后就是:
if(x>3) do{Action1(); Action2()}while)(0);
else .....;
此时就不会出现编译错误。
所以使用do {。。。}while(0) 的形式来定义宏是一个良好的代码习惯。