Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376747
  • 博文数量: 47
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 1290
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-25 16:14
文章分类

全部博文(47)

文章存档

2019年(1)

2014年(1)

2013年(9)

2012年(36)

分类: LINUX

2012-06-17 23:48:50

    今天上网查了一下为什么内核中很多#define定义的宏为什么都加一个do{}while(0),明白了原来是这么回事,发表个文章和大家分享一下:
     我感觉使用这个最大的好处是能够使用更复杂的宏定义,保证了程序好的性能性。
 
     我感觉要说清楚这个问题还是用具体的例子来说可能会更清晰一些:
     如果我们定义一个宏:#define  MAX1     x=x1;y=x2;
     再定义一个宏:#define MAX2  do{ x=x1;y=x2;}while(0)
     我们分别调用这两个宏:
     if(1)
     MAX1;
     结果并不是想要的答案,眼睛敏锐的人都能发现少了个大括号,只能执行第一句;
     if(1)
     MAX2;
     可以完成我们想要的答案!
     有的同学又质疑了,为什么我们不直接在宏定义的时候加上花括号,我们来看看效果:
     #define MAX1 {x=x1;y=x2;}
     我们调用此定义:
     if(1)
     MAX1;
     大家仔细看,有什么问题?是不是多了个分号,这是我们编程的习惯!可是就是这样的举动会让你的程序无法正常运行!
    可能还会有人发问:我们可以直接在if之后加上花括号,这个也是好的编程学员的变现,可是大家有没有想过内核是面向所有人的,这样做是不是太有些片面呢?
 
    当然他还有别的用处:比如说可以避免空语句在编译的时候出现警告Waining;存在一个空的基本块,可以在里面定义局部变量。
   以上就是我的理解,如果有不对的还请指出来!
    
    
阅读(4486) | 评论(3) | 转发(1) |
0

上一篇:神奇的分法

下一篇:likely和unlikely

给主人留下些什么吧!~~

lwp2252012-06-19 22:02:47

我会改进的!

zhe_wang2012-06-18 16:57:51

有点乱,而且没有说出哪些情况不加do{}while(0),define定义的宏函数会出错。