do { ....} while(0) 在宏里冗余的意义

do { ....} while(0) 在宏里冗余的意义

cocos2d-x提供了许多宏模板,如:CC_SAFE_RETAIN(p),CC_SAFE_DELETE(p) 等等

查看一下CC_SAFE_RETAIN的源码:

#define CC_SAFE_RETAIN(p)            do { if(p) { (p)->retain(); } } while(0)

为什么要使用 do{}while(0)语句,它不是只执行一次吗?,为何看的这么令人费解呢?,它与直接使用if(){}语句有什么不同?

假设这里去掉do...while(0),

#define SAFE_DELETE(p) delete p; p = NULL;

那么以下代码:

if(NULL != p) SAFE_DELETE(p)

存在问题:无论if判断是否通过,p=NULL;这句都能执行。

你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do...while,  我直接用{}括起来就可以了 

#define SAFE_DELETE(p) { delete p; p = NULL;}

的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码: 

if(NULL != p) SAFE_DELETE(p);
else   ...

因为if(exp){};else... 这连编译都通不过。

所以采用do...while(0)是做好的选择了,对于一个library的作者,他所要做的就是让其库具有通用性,我们不能指望所有人都习惯性的都写成if(){}else{}这中方式。

 

 

 

 

 

posted on 2014-07-06 22:43 慵懒的猫 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/zouly/p/3828759.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iphone换机数据迁移_iPhone迁移数据到Android(相册与短信)

2020年09月20日前言:卖掉iPhone7暂时回到Android手机,然后需要将iPhone内的资料迁移到新手机中。我尽量不使用第三方工具实现迁移工作。一般新手机都会有迁移助手,但是都不完美,毕竟是两个不同手机系统,很多东西还是需…

网关和路由的区别

网关:网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为25…

Java里阻塞线程的三种实现方法

在日常开发中,我们有时会遇到遇到多线程处理任务的情况,JDK里提供了便利的 ThreadPoolExecutor以及其包装的工具类Executors。但是我们知道 ExecutorService.excute(Runnable r)是异步的,超过线程池处理能力的线程会被加入到执行队列里。有时…

使用 dotnet-outdated 维护项目 nuget 包版本

使用 dotnet-outdated 维护项目 nuget 包版本Intro我们项目中或多或少都会有一些 NuGet 包,使用到 NuGet 包时,如何保证我们的 NuGet 包不会太旧呢?我们可以借助 dotnet-outdated 来检查项目中的 NuGet 包是否有更新Sample首先我们需要执行 d…

mysql-5.5.31主从复制

给数据库用户配置groupadd mysqluseradd -g mysql mysql -s /sbin/nologinrm -rf /home/mysqlmkdir -p /opt/mysqlchmod -R 755 /opt/mysqlchown -R mysql:mysql /opt/mysql准备工作:安装基本依赖包,先用yum安装cmake、automake 、autoconf ,…

被一帮小姐姐围着是什么感觉?

1 阿姨:我靠灵魂呼吸...▼2 医学院护理班男生的日常▼3 嫌自己活太久了?▼4 看来还是作业太少了▼5 小孟老师,您妈!▼6 哈哈哈哈哈,不行了...▼7 他今天是不会跟你走的!!!▼8 …

OSI各层相关的协议

<pre id"best-content-639348667" class"best-text mb-10" name"code" style"white-space: pre-wrap; word-wrap: break-word;">一、<strong>OSI各层</strong> 物理层&#xff1a;EIA/TIA-232, EIA/TIA-499, V.35, …

仓库处理中 无法修改_上海电商仓储物流公司,冷链仓库-上海玖日仓储

首页 > 新闻列表 > 浏览文章发布时间&#xff1a;2020-10-21 15:03:33 浏览量&#xff1a; 4导读&#xff1a;上海玖日仓储为您提供上海电商仓储物流公司,冷链仓库的相关知识与详情&#xff1a; 货物出入库扫描功能&#xff0c;同时记录扫描时间&#xff1b;完善订单与仓…

java轻量级Http Server

lighttpd 官方主页&#xff1a;www.lighttpd.netLighttpd是一个德国人领导的开源软件&#xff0c;其根本的目的是提供一个专门针对高性能网站&#xff0c;安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销&#xff0c;cpu占用率低&#xff0c;效能好&#…

使用CDN引用jQuery

CDN (Content Delivery Network) 内容分发网络。 Google 为一系列 JavaScript 库提供了免费的 CDN&#xff0c;包括&#xff1a; jQueryPrototypeMooToolsDojoYahoo! YUI如需在您的网页中使用 JavaScript 框架库&#xff0c;只需在 <script> 标签中引用该库即可&#xff…

13 个 C# 10 特性

常量的内插字符串C# 10 允许使用在常量字符串初始化中使用插值, 如下const string name "Oleg"; const string greeting $"Hello, {name}.";Console.WriteLine(greeting); // Output: Hello, Oleg.扩展属性模式从 C# 10 开始&#xff0c;您可以在适当的模…

nodejs安装express框架

安装express框架npm install express -gd-g代表安装到NODE_PATH的lib里面&#xff0c;而-d代表把相依性套件也一起安装。如果沒有-g的话会安装目前所在的目录(会建立一个node_modules的文件夹)&#xff0c;express –help 查看帮助cd /data/wwwroot/express –ejs –sessions m…

学习总结之数据挖掘三大类六分项

Data Mining可分为三大类六分项来说明&#xff1a; Classification和Clustering属于分类区隔类&#xff1b; Regression和Time-series属于推算预测类&#xff1b; Association和Sequence则属于序列规则类。 Classification是根据一些变量的数值做计算&#xff0c;再依照结果作分…

android studio button位置_免费的Android开发环境

Android Studio for mac是一个全面的Android开发环境&#xff0c;Android Studio帮助您设计&#xff0c;构建&#xff0c;测试和调试Android应用程序&#xff0c;利用Android Studio所有特色工具并开发出令人惊叹的应用程序。Android Studio是一个为Android平台开发程序的集成开…

TCP握手/挥手的过程分析

TCP连接建立 在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;采用三次握手建立一个连接。 服务器必须准备好接受外来的连接。这通过调用socket、 bind和listen函数来完成&#xff0c;称为被动打开(passive open)。 第一次握手&#xff1a;客户通过调用connec…

Android数据库Realm实践

Android开发中常用的数据库有5个&#xff1a; 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架&#xff0c;它是Java ORM。支持JDBC连接&#xff0c;Spring以及Android平台。语法中广泛使用了注解&#xff08;Annotation&#xff09;。 2. SugarORM SugarORM 是 Android …

Dotnet 6.0 深度探索(一)

Dotnet 6.0 已来。Dotnet 6.0 大家都装了没&#xff1f;我打算开个专题&#xff0c;系统地写一写 Dotnet 6.0 在各个方面的特性&#xff0c;以及全新的开发方式。也是因为最近讨论 6.0 比较多&#xff0c;看到很多人的畏难情绪&#xff0c;所以打算写写相关的内容。了解了&…

TCP协议中的三次握手和四次挥手(图解)

建立TCP需要三次握手才能建立&#xff0c;而断开连接则需要四次握手。整个过程如下图所示&#xff1a; 先来看看如何建立连接的。 首先Client端发送连接请求报文&#xff0c;Server段接受连接后回复ACK报文&#xff0c;并为这次连接分配资源。Client端接收到ACK报文后也向Serv…