博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux do{} while(0)
阅读量:5283 次
发布时间:2019-06-14

本文共 1240 字,大约阅读时间需要 4 分钟。

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

转载于:https://www.cnblogs.com/Malphite/p/10427487.html

你可能感兴趣的文章
c# 文件笔记
查看>>
类和结构
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
SWIFT国际资金清算系统
查看>>
站立会议第四天
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
UVa 11059 最大乘积
查看>>