linux之do{...}while(0)的简单实例

和菜鸟一起学linux之do{...}while(0)的简单实例

转载:http://blog.csdn.net/eastmoon502136/article/details/8081108

分类: linux 175人阅读 评论(0) 收藏 举报

       最近网上很流行一句话,那就是,元芳,你怎么看呢?那么对于那个linux内核中的宏定义中用的do{…}while(0),元芳,你怎么看呢?

       实践出真知,还是写几行代码,来调试调试吧。Linux内核中有着太多太多的奇妙的用法。人类积聚着的财富啊,不像windowslinux是可以让我看到,学习的。而对于windows,那就只能是写写他们准备好了的API,调用下函数,殊不知其中做了什么。

还是先看下代码吧:

 

  1. #include <stdio.h>  
  2.   
  3.    
  4. void aa(void)  
  5. {  
  6.     printf("%s\n",__func__);  
  7. }  
  8.   
  9. void bb(void)  
  10. {  
  11.        printf("%s\n",__func__);  
  12. }  
  13.   
  14. #define myfunc(tmp) do{ if(tmp) aa();}while(0)  
  15. //#define myfunc(tmp) if(tmp) aa()  
  16.   
  17. #define myswap(x, y)  do{int temp = xx = yy = temp;}while(0)  
  18. //#define myswap(x, y)  {int temp = xx = yy = temp;}  
  19.   
  20. int main(void)  
  21. {  
  22.        int n = 0;  
  23.        int a = 2;  
  24.        int b = 8;  
  25.        myswap(a, b);  
  26.        printf("a = %d, b = %d\n", a, b);    
  27.   
  28.        if(n)  
  29.               myfunc(1);  
  30.        else  
  31.               bb();         
  32.   
  33.        return 0;  
  34. }  


 

这里定义了两个宏,每个宏用了两种方式,加上do{…}while(0)和不加的。对于第一个宏

  1. #define myfunc(tmp) do{ if(tmp) aa();}while(0)  


可以知道,就是如果传入的参数tmp为真,那么打印aa,如果传入的tmp为假,那么打印bb。这个很好理解。然后把main函数中的代码拆分

  1. if(n)  
  2.      myfunc(1);  
  3.   
  4. else  
  5.      bb();         


 

======= >>

  1. if(n)  
  2.   
  3.               do{ if(1) aa();}while(0) ;  
  4.   
  5.        else  
  6.   
  7.               bb();       


 

这个没有问题。

 

但是如果把不加do{…}while(0)呢?

  1. #define myfunc(tmp) if(tmp) aa()  


我们来看下main函数中的代码

  1. if(n)  
  2.   
  3.               myfunc(1);  
  4.   
  5.        else  
  6.   
  7.               bb();         
  8.   
  9.    


======== >>

 

  1. if(n)  
  2.   
  3.               if(1) aa();  
  4.   
  5.        else  
  6.   
  7.               bb();     


   

 

这里的else永远不会运行到。由此可见,do{…}while(0)的好处之一了。

 

接着就是第二个宏了

  1. #define myswap(x, y)  do{int temp = xx = yy = temp;}while(0)  


main函数中拆分

myswap(a, b);

 

======== >>

 

  1. do{int temp = aa = b ;b = temp;}while(0);  


 

实现的是交换的功能。

 

  1. #define myswap(x, y)  {int temp = xx = yy = temp;}  


main函数中拆分

myswap(a, b);

 

======== >>

 

  1. int temp = aa = b ;b = temp;;  
  2.   
  3.    


多了一个空语句。

 

这个就是do{…}while(0)的好处之二了。

 

不知是谁想到的,程序的微妙之处啊。

posted @ 2013-07-06 17:55  云翔世界  阅读(170)  评论(0)    收藏  举报