zoukankan      html  css  js  c++  java
  • 第3章(3) do{}while(0)语句

    do {} while (0) 主要在宏定义后为语句中使用,比如:

    #define macrofun(a, b, c)    
            do {                              
                    if (a == 5)             
                    do_this(b, c);        
             } while (0)
    

    下面我们看看这样的写法的好处。

    首先,我们定义一个简单的宏:

    #define SAFE_FREE(p)  free(p); p = NULL;
    

    那么对于如下的代码

    if (NULL != p)
            SAFE_FREE(p);
    else
            ;  // do something
    

    就会被展开成

    if (NULL != p)
            free(p); p = NULL;;
    else
            ;  // do something
    
    1. else找不到if
    2. 就算没有else分支,p = NULL;无论如何都会运行,这和我们的逻辑不符
    3. 出现了两个分号。
      其实我们把宏定义引用后面的分号删掉,再把宏定义后的语句用“{}”括起来也可以解决,也就是这样:
    #define SAFE_FREE(p)  {free(p); p = NULL;}
    
    if (NULL != p)
            SAFE_FREE(p)
    else
            ;  // do something
    

    就展开成了

    if (NULL != p)
            {free(p); p = NULL;}
    else
            ;  // do something
    

    好的,问题解决了,但是你看到上面的代码不难受吗???总想加个分号上去!而且我敲代码的时候还得注意我到底调用的是函数,还是引用的宏?分号到底加是不加?多累啊。

    然而,使用 do {} while (0) 就完美解决了上面的所有问题。请看:

    #define SAFE_FREE(p)  do {free(p); p = NULL;} while (0)
    
    if (NULL != p)
            SAFE_FREE(p);
    else
            ;  // do something
    

    就展开成了

    if (NULL != p)
            do {free(p); p = NULL;} while (0);
    else
            ;  // do something
    

  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/raina/p/11121677.html
Copyright © 2011-2022 走看看