深度理解do{} while(0)

在linux内核中常常会看到do{} while(0)这样的语句,有人疑惑,认为无意义,因为他只执行一次,加不加do{} while(0)小过失完全一样的,那你就错了,没有完全了解do{} while(0)。下面看一个例子:

定义一个宏:

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

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

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

那么一下代码

If(NULL!=p)SAFE_FREE(p)else.......

会被展开成:

If(NULL!=p)free(p); p=NULL;else.......

展开存在两个问题:

  1. 因为if分支后面有两个语句,导致else分支没有对应的if,编译失败。
  2. 假设没有else分支,则SAFE_FREE中的第二个语句无论if测试是否通过,都会执行。

如何解决以上问题呢?

有人说给SAFE_FREE的定义加上{}就可以解决上述问题了,即:

#define SAFE_FREE(p)  { free(p); p=NULL; }代码展开如下:If(NULL!=p){ free(p); p=NULL; }else.......

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

If(NULL!=p){ free(p); p=NULL; };else.......

问题又来了,这样else又没有对应的if了,编译还是失败。假设用了do{} while(0)就可以解决上面的一系列问题了,代码如下:

If(NULL!=p)do { free(p); p=NULL; } while(0);else.......

所以do {} while(0)的使用时为了保证宏定义的使用者能无编译错误的用宏。

深度理解do{} while(0)语句的作用相关推荐

  1. 基于MySQL 8.0 对事务的深度理解

    基于MySQL 8.0 对事务的深度理解 一.MySQL中事务隔离级别 事务的隔离级别有哪些? 隔离级别 脏读 不可重复读 幻读(虚读) 未提交读(Read uncommitted) 可能 可能 可能 ...

  2. sql 语句中 Sum(*) Nvl(name,0) Coun(*)的作用

    SUM(name)D的作用就是计算当前列名字为name所有字段的和 NVL(name,0)的作用相当于判空语句,if为空则取后面的0 为值,若不为空取本身的值 COUNT(NAME)  对符合条件的数 ...

  3. break在java语言中什么意思_在Java语言的控制结构中,break语句是经常用到的语句。在switch语句中break语句的作用是( )_学小易找答案...

    [单选题]( )是一个综合性的网络营销工具,在所有的网络营销工具中也是最基本.最重要的一个. [单选题]给出下列的代码,哪行在编译时可能会有错误( ) 1 public static void mai ...

  4. 快速平方根倒数算法深度理解

    快速平方根倒数算法深度理解 快速平方根倒数算法是什么? 简单来说这个算法避开了开方和除法运算快速实现了 y = 1 x y= \frac{1}{\sqrt x} y=x ​1​ 快速平方根倒数算法首次 ...

  5. 解析java当中switch语句的作用和break、continue关键字的用法

    解析java当中switch语句的作用和break.continue关键字的用法 A. switch语句 1.含义 是分支结构,使程序按照条件的判断结果去执行相应的程序代码. 2.语法 switch( ...

  6. 深入理解Python的With-as语句

    学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭.比如:我想把一些对象序列化到文件里面,然后当我再次使用的时候,在从文件里面读取反序列化成对象.像这种操作一般都是用try-exce ...

  7. python中if else语句_python 中if else 语句的作用及示例代码

    引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...

  8. 理解OAuth 2.0(转)

    From: http://www.mamicode.com/info-detail-1610036.html 理解OAuth 2.0 作者: 阮一峰 日期: 2014年5月12日 OAuth是一个关于 ...

  9. [转载]理解OAuth 2.0

    原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 理解OAuth 2.0 作者: 阮一峰 OAuth是一个关于授权(authoriz ...

最新文章

  1. 无法访问http,会强制跳到https
  2. LAMP服务搭建详解
  3. 汇编中的BP与SS组合时,BP里面放的到底是SS中的一个基地址的指针还是基地址本身?
  4. SSM学习(一)Mybatis
  5. python操作hbase配置记录-基于thrift2协议
  6. 具有InlfuxDB的Spring Boot和Micrometer第2部分:添加InfluxDB
  7. 滴滴全链路压测解决之道 | 技术头条
  8. 如何测试WEB应用程序防止SQL注入***
  9. 优秀程序员都有哪些编程习惯?
  10. 区块链学习(二)以太坊私有链搭建
  11. 直流有刷电机与无刷电机的区别
  12. 修改金仓数据库KingbaseES端口
  13. java计算机毕业设计网上鲜花店系统源码+系统+数据库+lw文档
  14. 给初学者的RxJava2.0教程(八)
  15. python七夕表白代码(转载)
  16. 验证码识别dll库,识别率95%
  17. 1.4 Git基本操作之删除文件找回及文件比较
  18. 201619101025刘洋
  19. 直流功率传感器行业调研报告 - 市场现状分析与发展前景预测
  20. 数学基础task05 高等数学之中值定理

热门文章

  1. C#_完整的RSA操作类
  2. Dart 调用C语言混合编程
  3. CentOS7下的Django2集成部署五:Jenkins的流水线部署pipeline-job
  4. Matlab图像处理教程
  5. freeswitch模块之event_socket
  6. code::blocks 修改代码字体颜色大小等
  7. SSAS : 使用.NET为SSAS编写自定义程序集
  8. ROS学习(十一):ROS URDF-model
  9. 汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)
  10. 函数参数---动态参数