do{ ... } while(0)
来源:互联网 发布:easyui js隐藏a标签 编辑:程序博客网 时间:2024/05/16 11:26
http://www.examw.com/linux/all/119630/
为什么在内核中碰到很多 #defines ... do{ ... } while(0)?
有以下几点原因:
·空语句在编译时候会出现警告,所以有必要用#define FOO do { } while(0).
·这样做是为了能够在里面定义局部变量
·这样做是为了能够在条件语句中使用复杂的宏定义. 例如下面这段代码:
#define FOO(x) \
printf("arg is %s\n", x); \
do_something_useful(x);
如果这样用:
if (blah == 2)
FOO(blah);
将会被展开为:
if (blah == 2)
printf("arg is %s\n", blah);
do_something_useful(blah);;
这样,if条件之包含了printf()语句,而 do_something_useful()调用不能按期望那样工作。而使用 do { ... } while(0)定义后,就会展开成以下语句:
if (blah == 2)
do {
printf("arg is %s\n", blah);
do_something_useful(blah);
} while (0);
这是所期望的状况.
·如果你希望定义一个包含多行语句和一些局部变量的时候. 一般的定义方式只能这样:
#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }
然而在某些情况下,这样并不能正常工作. 下面是包含两个分支的if语句:
if (x > y)
exch(x,y); // Branch 1
else
do_something(); // Branch 2
但这样却只能展开成单分支的if语句,如下:
if (x > y) { // 单分支if
int tmp;
tmp = x;
x = y;
y = tmp;
}
; // 空语句
else // 错误!!! "parse error before else"
do_something();
问题是由于在语句块后直接加入分号(;)引起的. 解决办法是将语句块放入 do 和 while (0)中间.这样就得到了一条单语句, 而不是被编译器判断为语句块.现在的if语句如下:
if (x > y)
do {
int tmp;
tmp = x;
x = y;
y = tmp;
} while(0);
else
do_something();
- 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)
- springMVC自定义属性编辑器
- Android应用开发揭秘的第11个程序5_6_DrawText修改版和高仿版的源码注释
- CString 成员函数用法大全
- ubuntu启动时图形界面与文本界面的转换
- Android 边用边学 之 屏蔽HOME键的方法
- do{ ... } while(0)
- eclipse 中引用其他项目及项目打包
- 项目管理中的任务分配
- [OpenGL ES 07-2]Per-Vertex Light及深度缓存
- cmd怎么执行带包名的类
- Oracle/plsql 进程锁死处理
- pitch
- 关于Xerces-C++的一篇介绍文章
- 循环-猜数字