C++ 宏 为什么建议 do while (0) 的写法
2014-08-16 23:09
148 查看
在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) 的形式来定义宏是一个良好的代码习惯。
好处主要有以下:
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) 的形式来定义宏是一个良好的代码习惯。
相关文章推荐
- C++中为什么有delete[]这种写法?
- C++为什么不建议使用malloc,calloc,realloc来分配内存?
- C++:为什么C++里建议用const/枚举/内联去替代宏?
- 学习 C++ 的50条建议(转贴)
- [转]学C++ 的50条建议
- 转贴XML的写法建议
- 365key为什么要支持tag和使用建议
- 学C++ 的50条建议
- C++ Builder和托管C++中属性的使用建议
- 50条C++学习建议(已经看三遍了,很经典)
- 建议C++初学者或准备开发"处女"项目的程序员必看的经典思想
- C++ Standard Library扩充建议...
- 给C++的初学者的建议
- 获得文件长度的标准C++写法
- 学习 C++ 的50条建议
- 绝对经典 C++初学者必看的50个建议 (见过好几次了,还是放到我的日志中吧)
- 为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”
- [转]学C++ 的50条建议
- 绝对经典 C++初学者必看的50个建议
- 为什么中国的程序员不敢对C++标准委员会说不?