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)的使用完全是为了保证宏定义的使用者能无编译错误的使用宏,不对使用者做任何假设

linux do{} while(0)的更多相关文章

  1. Linux(RHEL7.0)下安装nginx-1.10.2

    查看当前系统版本是否支持 当前,nginx发布包支持以下Linux操作系统版本: RHEL/CentOS: Version Supported Platforms 5.x x86_64, i386 6 ...

  2. UEFI安装Kali Linux 1.1.0记录

    现在使用Kali Linux 1.1.0, UEFI启动,使用Fcitx的拼音输入法,词库实在不爽,将就写一写. 本文地址: http://www.cnblogs.com/go2bed/p/42954 ...

  3. debian7 请把标有“Debian GNU/Linux 7.1.0 _Wheezy_ - Official amd64 DVD Binary-1 20130615-23:06”的盘片插入驱动器“/media/cdrom/”再按回车键

    有时候,在通过apt-get install 安装软件的时候,会出现: 更换介质:请把标有“Debian GNU/Linux 7.1.0 _Wheezy_ - Official amd64 DVD B ...

  4. 如何在Ubuntu/CentOS上安装Linux内核4.0

    大家好,今天我们学习一下如何从Elrepo或者源代码来安装最新的Linux内核4.0.代号为‘Hurr durr I'm a sheep’的Linux内核4.0是目前为止最新的主干内核.它是稳定版3. ...

  5. window 远程在Linux(centOS7.0)上安装JDK以及配置环境变量

    本人是在windows 7 上安装了虚拟机,虚拟机安装的是linux(centOS7.0)系统现在在Windows 上安装SecureCRT 远程虚拟机的linux系统,安装JDK以及配置环境变量. ...

  6. Linux 进入 5.0 时代!

    Linux 进入 5.0 时代! 为什么 Linux 4.2 之后的版本不再是 4.21 而是 5.0? 如果你非要一个理由,那就是因为 Linux 4.x 的版本如今用手指与脚趾加在一起都要数不过来 ...

  7. 安装 Linux 内核 4.0

    大家好,今天我们学习一下如何从Elrepo或者源代码来安装最新的Linux内核4.0.代号为‘Hurr durr I'm a sheep’的Linux内核4.0是目前为止最新的主干内核.它是稳定版3. ...

  8. Linux下tomcat6.0与jdk安装

    Linux下tomcat6.0与jdk安装 步骤如下: 1. 上传apache-tomcat-6.0.37.tar.gz和jdk-6u13-linux-i586.bin至/usr/local 给这两个 ...

  9. Deepin15.8系统下安装QorIQ Linux SDK v2.0 yocto成功完美运行的随笔

    2019.2.17日:最终安装成功,完美解决! 2019.2.16日:最终安装未成功,但是过程中排除 了几个bug,前进了几步,仅供参考. 写在最前面,yocto安装是有系统要求的,Deepin 15 ...

  10. Linux安装php-7.0.16,完成php和apache的配置

    Linux安装php-7.0.16,完成php和apache的配置     版本:php-7.0.16.tar.gz,libxml2-2.9.2.tar.gz(php需要它的支持,首先安装它) 说明 ...

随机推荐

  1. bitbucket迁移

    bitbucket 迁移 1.停止向旧仓库地址提交代码 [dev]2.导入代码至新仓库地址 [op]3.修改本地仓库地址 第一种方式:git remote set-url origin [url] ; ...

  2. 剑指offer(20)包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...

  3. maven开发项目中遇到的问题

    java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com ...

  4. mvc 之 学习地址

    https://blog.csdn.net/mss359681091/article/details/52135861

  5. 《F4+2》—基于原型的团队项目需求调研与分析

    任务一 1.调研对象 老师和学生 2.所开发的软件原型 太阳系模型软件 3.调研方法 问卷调查法 原型法 任务二 采用UML模型描述任务1所获取的用户需求,如下: 主要需求: 教师:把系统展示给学生, ...

  6. 用GraphX分析伴生网络(一)

    1. 图论与GraphX 图论是一个数学学科,研究一组实体(称为顶点)之间两两关系(称为边)的特点.通过构建关系图谱,并对关系进行分析,可以实现更好的投放广告,推荐关系等.随着关系图谱越来越强大,计算 ...

  7. 异步核心接口IAsyncResult的实现

    要实现异步编程,就需要正确的实现IAsyncResult接口.IAsyncResult共有四个属性: public interface IAsyncResult { object AsyncState ...

  8. java去除表达符号的正则表达式

    java 去标点符号正则表达式 博客分类: 小功能 正则表达式标点符号  public static void main(String[] args) {String s = "哈哈!@#W ...

  9. yii2restful规范的api使用

    说明:restful是一套优秀的接口调用规范. 使用规范: 1,安装yii2 使用composer安装 安装完 Composer,运行下面的命令来安装 Composer Asset 插件: php c ...

  10. day042 css 选择器

    css(Cascading Style Sheet) 层叠样式表,定义了如何显示HTML元素,给HTML设置样式,让它看起来更好 一.css语法 css样式包括两部门,选择器(给谁的样式)和声明(什么 ...