请问内核中常出现的do { } while (0)是做什么用的?
比如,#define pte_unmap_nested(pte) do { } while (0)
为什么要这么写?谢谢。
直接写
#define pte_unmap_nested(pte)
不也一样吗?
为什么要这么写?谢谢。
直接写
#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();
在把宏引入代码中,会多出一个分号,从而会报错。
可能还有别的好处...相信内核代码风格
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设备驱动开发详解一书中有清晰讲解。
另,在linux设备驱动开发详解一书中有清晰讲解。
作者: dhc5251 发布时间: 2010-01-20
回复 dhc5251
哪一章?
哪一章?
作者: mingyuexuan 发布时间: 2010-03-10
第一次看到这个写法,想了想,明白了,觉得我很牛B。
第一次看见别人问这个写法,解释了一遍,觉得自己更牛B了。
第二次看见别人问,随口说情景分析第二章,感觉还好。
再看见别人问这个问题,自己回答了情景分析第二章,觉得自己很SB。
以后看见这个问题,还是情不自禁的进来赚分,觉得自己太无聊了。
呵呵,lz不要见怪,我只是描述一下,每个人都是一步一步走的,这里的牛人不屑回答你也不要灰心,有一天你也许不会跟老A一样,但是白金也很牛B啊。
第一次看见别人问这个写法,解释了一遍,觉得自己更牛B了。
第二次看见别人问,随口说情景分析第二章,感觉还好。
再看见别人问这个问题,自己回答了情景分析第二章,觉得自己很SB。
以后看见这个问题,还是情不自禁的进来赚分,觉得自己太无聊了。
呵呵,lz不要见怪,我只是描述一下,每个人都是一步一步走的,这里的牛人不屑回答你也不要灰心,有一天你也许不会跟老A一样,但是白金也很牛B啊。
作者: prolj 发布时间: 2010-03-11
呵呵 每个人都有不懂的时候。。
虚心的学习。。
虚心的学习。。
作者: ethanhuang 发布时间: 2011-03-08