do{…}while(0) 的巧用
来源:互联网 发布:淘宝网13岁女大童棉衣 编辑:程序博客网 时间:2024/05/21 15:40
转载:http://www.cnblogs.com/hibraincol/archive/2010/09/25/1834275.html
在linux内核代码中,有这样的宏定义:
#define DUMP_WRITE(addr,nr) do{ memcpy(bufp,addr,nr); bufg+=nr; }while(0)
这个宏定义意味着引用这个宏操作时会执行循环体一次,但为什么要定义成这样的怪形式呢?
我们看看其他几种形式的宏定义:
#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr); bufp+=nr;
这种宏定义行不行?
我们把这个宏放到一个语境中:
if (addr)
DUMP_WRITE(addr,nr);
else
do_something_else();
结果发现编译会出错,为什么?
把宏展开,上述语句块变为:
if (addr)
memcpy(bufp,addr,nr); bufp+=nr;
else
do_something_else();
这样就会在if-else语句之间加了一条语句bufp+=nr;形成类似于 if-dosomething-else 的语句。这样else将无法找到与之匹配的 if,所以编译器会报错。
换种引用形式:
if(!addr)
do_something_else();
else
DUMP_WRITE(addr,nr);
这样虽然编译能通过,但是问题会更严重,因为bufp+=nr; 会始终被执行。
到这里,我们可能马上会想到在宏定义中加一个大括号:
#define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp+=nr;}
这样能行吗?我们放到语境中测试下:
if (addr)
DUMP_WRITE(addr,nr);
else
do_something_else();
依然编译出错,为什么呢?
将宏展开之后为:
if (addr)
{memcpy(bufp,addr,nr); bufp+=nr;};
else
do_something_else();
这里在if-else语句中插入了一条空语句:if-空语句-else,同样的编译器也不能为 else 找到与之匹配的 if 语句。所以依然会编译报错。
而使用下面这种格式的宏定义,则完全没问题。
#define DUMP_WRITE(addr,nr) do{ memcpy(bufp,addr,nr); bufg+=nr; }while(0)
- do{…}while(0) 的巧用
- do{…}while(0) 的巧用
- do…while(0)的妙用
- do…while(0)的妙用
- do…while(0)的妙用
- do…while(0)的妙用
- do…while(0)的妙用
- do…while(0)的妙用
- do{}while(0)的意义
- do/while(0)的妙用
- do/while(0)的妙用
- do...while(0)的用法
- do/while(0)的妙用
- do...while(0)的妙用
- do/while(0)的妙用
- do/while(0)的妙用
- do{} while(0)的使用
- do...while(0) 的妙用
- 程序员必学的Photoshop技术之制作(一)圆角矩形图片
- mac 使用小技巧
- 分析案情
- Oracle中TO_DATE TO_CHAR格式
- Linux代码性能检测利器(一)--OProfile概述
- do{…}while(0) 的巧用
- clock()函数用法
- 使用Mysqldump 备份数据库
- C# 获取星期
- QQ群和Google讨论组现已开通,热忱欢迎你的加入
- C# WPF 快速开发09数据库封装类SqlHelper
- 排序算法
- C# WPF 快速开发10登陆界面
- 让code 支持lua