今天上网查了一下为什么内核中很多#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) |