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


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

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

    还是先看下代码吧:

     

    #include <stdio.h>
    
     
    void aa(void)
    {
        printf("%s\n",__func__);
    }
    
    void bb(void)
    {
           printf("%s\n",__func__);
    }
    
    #define myfunc(tmp) do{ if(tmp) aa();}while(0)
    //#define myfunc(tmp) if(tmp) aa()
    
    #define myswap(x, y)  do{int temp = x; x = y; y = temp;}while(0)
    //#define myswap(x, y)  {int temp = x; x = y; y = temp;}
    
    int main(void)
    {
           int n = 0;
           int a = 2;
           int b = 8;
           myswap(a, b);
           printf("a = %d, b = %d\n", a, b);  
    
           if(n)
                  myfunc(1);
           else
                  bb();       
    
           return 0;
    }
    
    


     

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

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


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

    if(n)
         myfunc(1);
    
    else
         bb();       
    
    


     

    ======= >>

    if(n)
    
                  do{ if(1) aa();}while(0) ;
    
           else
    
                  bb();     
    


     

    这个没有问题。

     

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

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


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

    if(n)
    
                  myfunc(1);
    
           else
    
                  bb();       
    
     
    
    


    ======== >>

     

    if(n)
    
                  if(1) aa();
    
           else
    
                  bb();   
    


       

     

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

     

    接着就是第二个宏了

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


    main函数中拆分

    myswap(a, b);

     

    ======== >>

     

    do{int temp = a; a = b ;b = temp;}while(0);
    
    


     

    实现的是交换的功能。

     

    #define myswap(x, y)  {int temp = x; x = y; y = temp;}
    


    main函数中拆分

    myswap(a, b);

     

    ======== >>

     

    int temp = a; a = b ;b = temp;;
    
     
    
    


    多了一个空语句。

     

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

     

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

  • 相关阅读:
    Java-列出所有系统属性
    Java-一个数组中的元素复制到另一个数组
    Java-将字符串转为数字
    Java单例模式简单实现
    Spring注解@Component、@Repository、@Service、@Controller
    VisualGDB系列2:VisualGDB对Linux平台的支持特性
    VisualGDB系列1:VisualGDB总体概述
    Docker入门(七):部署app
    Docker入门(六):Stacks
    Docker入门(五):Swarms
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300049.html
Copyright © 2020-2023  润新知