请问内核中常出现的do { } while (0)是做什么用的?

比如,#define pte_unmap_nested(pte)        do { } while (0)

为什么要这么写?谢谢。
直接写
#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

回复 dhc5251


    哪一章?

作者: mingyuexuan   发布时间: 2010-03-10

第一次看到这个写法,想了想,明白了,觉得我很牛B。
第一次看见别人问这个写法,解释了一遍,觉得自己更牛B了。
第二次看见别人问,随口说情景分析第二章,感觉还好。
再看见别人问这个问题,自己回答了情景分析第二章,觉得自己很SB。
以后看见这个问题,还是情不自禁的进来赚分,觉得自己太无聊了。


呵呵,lz不要见怪,我只是描述一下,每个人都是一步一步走的,这里的牛人不屑回答你也不要灰心,有一天你也许不会跟老A一样,但是白金也很牛B啊。

作者: prolj   发布时间: 2010-03-11

呵呵 每个人都有不懂的时候。。
虚心的学习。。

作者: ethanhuang   发布时间: 2011-03-08