深度理解do{} while(0)语句的作用
深度理解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.......
展开存在两个问题:
- 因为if分支后面有两个语句,导致else分支没有对应的if,编译失败。
- 假设没有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)语句的作用相关推荐
- 基于MySQL 8.0 对事务的深度理解
基于MySQL 8.0 对事务的深度理解 一.MySQL中事务隔离级别 事务的隔离级别有哪些? 隔离级别 脏读 不可重复读 幻读(虚读) 未提交读(Read uncommitted) 可能 可能 可能 ...
- sql 语句中 Sum(*) Nvl(name,0) Coun(*)的作用
SUM(name)D的作用就是计算当前列名字为name所有字段的和 NVL(name,0)的作用相当于判空语句,if为空则取后面的0 为值,若不为空取本身的值 COUNT(NAME) 对符合条件的数 ...
- break在java语言中什么意思_在Java语言的控制结构中,break语句是经常用到的语句。在switch语句中break语句的作用是( )_学小易找答案...
[单选题]( )是一个综合性的网络营销工具,在所有的网络营销工具中也是最基本.最重要的一个. [单选题]给出下列的代码,哪行在编译时可能会有错误( ) 1 public static void mai ...
- 快速平方根倒数算法深度理解
快速平方根倒数算法深度理解 快速平方根倒数算法是什么? 简单来说这个算法避开了开方和除法运算快速实现了 y = 1 x y= \frac{1}{\sqrt x} y=x 1 快速平方根倒数算法首次 ...
- 解析java当中switch语句的作用和break、continue关键字的用法
解析java当中switch语句的作用和break.continue关键字的用法 A. switch语句 1.含义 是分支结构,使程序按照条件的判断结果去执行相应的程序代码. 2.语法 switch( ...
- 深入理解Python的With-as语句
学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭.比如:我想把一些对象序列化到文件里面,然后当我再次使用的时候,在从文件里面读取反序列化成对象.像这种操作一般都是用try-exce ...
- python中if else语句_python 中if else 语句的作用及示例代码
引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...
- 理解OAuth 2.0(转)
From: http://www.mamicode.com/info-detail-1610036.html 理解OAuth 2.0 作者: 阮一峰 日期: 2014年5月12日 OAuth是一个关于 ...
- [转载]理解OAuth 2.0
原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 理解OAuth 2.0 作者: 阮一峰 OAuth是一个关于授权(authoriz ...
最新文章
- 无法访问http,会强制跳到https
- LAMP服务搭建详解
- 汇编中的BP与SS组合时,BP里面放的到底是SS中的一个基地址的指针还是基地址本身?
- SSM学习(一)Mybatis
- python操作hbase配置记录-基于thrift2协议
- 具有InlfuxDB的Spring Boot和Micrometer第2部分:添加InfluxDB
- 滴滴全链路压测解决之道 | 技术头条
- 如何测试WEB应用程序防止SQL注入***
- 优秀程序员都有哪些编程习惯?
- 区块链学习(二)以太坊私有链搭建
- 直流有刷电机与无刷电机的区别
- 修改金仓数据库KingbaseES端口
- java计算机毕业设计网上鲜花店系统源码+系统+数据库+lw文档
- 给初学者的RxJava2.0教程(八)
- python七夕表白代码(转载)
- 验证码识别dll库,识别率95%
- 1.4 Git基本操作之删除文件找回及文件比较
- 201619101025刘洋
- 直流功率传感器行业调研报告 - 市场现状分析与发展前景预测
- 数学基础task05 高等数学之中值定理