zoukankan      html  css  js  c++  java
  • linux do{} while(0)

      do{}while(0)

      在linux中,经常会看到do{}while(0)这样的语句,许多人开始都会疑惑,认为do{}while(0)毫无意义,因为它只会执行一次,加不加do{}while(0)效果是一样的,其实do{}while(0)

    的用法主要在于宏定义中。

      这里用一个简单的宏来演示:

      #define SAFE_FREE(p) do{ free(p); p = NULL; } while(0)

      假设这里去掉do{...}while(0),即定义SAFE_FREE  为:

      #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、因为if分支后有两个语句。导致else分支没有对应的if,编译失败

      2、假设没有else分支,则SAFE_FREE中的第二个语句无论if测试是否通过,都会执行。

      的确,将SAFE_FREE的定义加上{}就可以解决上述问题,即:

      #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*/

       但是,在 c程序中,每个语句后加分号是一种约定俗成的习惯,那么,如下代码:

      if(NULL != p)

        SAFE_FREE(p);

      else

        .../*do something*/

      将被扩展为:

      if(NULL != p)

        {free(p); p = NULL;};

      else

        .../*do something*/

      这样,else分支就又没有对应的if了,编译将无法通过,假设用了do{} while(0),情况就不一样了,同样的代码会被展开为:

      if(NULL != p)

         do{ free(p); p = NULL; } while(0);

      else

        .../*do something*/

      不会再出现编译问题。 do{ } while(0)的使用完全是为了保证宏定义的使用者能无编译错误的使用宏,不对使用者做任何假设

  • 相关阅读:
    jquery.validate使用攻略 5
    jquery.validate使用攻略 4
    ccnet1.5集成tfs中文版的问题
    解决mysql连接异常—com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception
    Myeclipse 6.5 增加对 JavaEE 6 的支持
    Python3.7环境配置
    myeclipse 8.6 software and workspace center is currently not available
    入坑cordova
    开启博客之路
    如何在高并发的分布式系统中产生UUID
  • 原文地址:https://www.cnblogs.com/Malphite/p/10427487.html
Copyright © 2011-2022 走看看