请问内核中常出现的do { } while (0)是做什么用的?
时间:2009-12-31
来源:互联网
为什么要这么写?谢谢。
直接写
#define pte_unmap_nested(pte)
不也一样吗?
作者: tassard 发布时间: 2009-12-31
作者: platinum 发布时间: 2009-12-31
i = i+1;
i += 1;
i++;
为什么用i++而不用i = i+1呢?
我以前总结的:
1,空的宏定义避免warning:
#define foo() do{}while(0)
2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。
3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:
#define foo(x) \
action1(); \
action2();
在以下情况下:
if(NULL == pPointer)
foo();
就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。
4,以上的第3种情况用单独的{}也可以实现,但是为什么一定要一个do{}while(0)呢,看以下代码:
#define switch(x,y) {int tmp; tmp="x";x=y;y=tmp;}
if(x>y)
switch(x,y);
else //error, parse error before else
otheraction();
在把宏引入代码中,会多出一个分号,从而会报错。
可能还有别的好处...相信内核代码风格
作者: ubuntuer 发布时间: 2009-12-31
另,在linux设备驱动开发详解一书中有清晰讲解。
作者: dhc5251 发布时间: 2010-01-20
哪一章?
作者: mingyuexuan 发布时间: 2010-03-10
第一次看见别人问这个写法,解释了一遍,觉得自己更牛B了。
第二次看见别人问,随口说情景分析第二章,感觉还好。
再看见别人问这个问题,自己回答了情景分析第二章,觉得自己很SB。
以后看见这个问题,还是情不自禁的进来赚分,觉得自己太无聊了。
呵呵,lz不要见怪,我只是描述一下,每个人都是一步一步走的,这里的牛人不屑回答你也不要灰心,有一天你也许不会跟老A一样,但是白金也很牛B啊。
作者: prolj 发布时间: 2010-03-11
虚心的学习。。
作者: ethanhuang 发布时间: 2011-03-08
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28