Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78875
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-02 16:15
文章分类
文章存档

2016年(24)

我的朋友

分类: LINUX

2016-04-29 16:24:24

    今天上网查了一下为什么内核中很多#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;存在一个空的基本块,可以在里面定义局部变量。
   以上就是我的理解,如果有不对的还请指出来!
    
    
阅读(1420) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~