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

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

  1. do {...} while (0) 在宏定义中的作用

    有篇文章解释很清楚:do {...} while (0) in macros 然后,一位女程序媛把它翻译了一遍,排版清晰,想省力的看这边.do {...} while (0) 在宏定义中的作用

  2. element upload预览_vue2.0 使用element-ui里的upload组件实现图片预览效果方法

    1.首先我们在cli中引入element-ui 2.然后在具体的代码中放入uoload组件 点击上传 只能上传jpg/png文件,且不超过500kb 3.使用element-ui的upload组件中提 ...

  3. 位于0/nut文件里的'Calculated'边界条件是什么意思?【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-pre-processing/140984-what-does-calcul ...

  4. android+平板+10寸,最便宜的安卓3.0平板 宏碁10寸双核体验

    [IT168 评测]何时谷歌能推出专门针对平板电脑的操作系统?这成为影响2011年Android平板电脑销售成败的最大关键.幸运的是问题已经有了答案:Android 3.0 Honeycomb成为救世 ...

  5. 画面测试时,图片显示时,0件与N件的意义!

    我们有时,会在画面上显示一些图片. 比如说一些商品的图片. 这些商品分为不同种类,分别分组显示. 这时我们对每一组,都有测试0件,N件的意义. 意义: 测试0件,可能是这个区域中的某个逻辑控制写错了, ...

  6. do...while(0)在宏定义中的巧妙用法

    大家都知道,do-while(condition)可以表示循环,但你有没有遇到在一些宏定义中可以不用循环的地方,也用到了 do-while.比如: #define DELETE_POINTER(p) ...

  7. 为什么[]==0;JavaScript里什么情况下a==!a为true呢?

    原文链接 JavaScript里什么情况下a==!a为true呢? 答案是当a = []的时候,这是因为JavaScript的类型转换. 我们先来考虑这个问题,console.log([] == fa ...

  8. 抄笔记:尤雨溪在Vue3.0 Beta直播里聊到了这些…

    前言 在 4 月 21 日晚,Vue 作者尤雨溪在哔哩哔哩直播分享了Vue.js 3.0 Beta最新进展. 以下是直播内容整理 1. 全新文档RFCs Vue.js 3.0 Beta发布后的工作重点 ...

  9. asp.net 2.0 中GridView里设置日期格式

    在asp.net 1.0 中的datagrid 中 设置日期字段格式时用 DataFormatString="{0:yyyy-MM-dd}"即可.    在gridview 中设置 ...

最新文章

  1. babylonjs 分部加载模型_如何使用BabylonJS加载OBJ或STL模型
  2. Oracle分析函数-OLAP函数总结
  3. 华硕笔记本装linux系统教程视频,在新买的华硕笔记本电脑安装linux手记
  4. uva 10716 Evil Straw Warts Live
  5. html5 手机拍视频滤镜,用canvas实现图片滤镜效果附演示_html5教程技巧
  6. java ssm项目_JAVA项目:逝去的SSM
  7. 服务器报告它来自digest_【关注】服务器行业现状研究
  8. Android 应用开发(33)---Android程序签名打包
  9. Linux学习总结(64)——DBA常用的Linux命令汇总
  10. 《设计原本—计算机科学巨匠Frederick P. Brooks的反思》一一第 3 章 理性模型有哪些缺陷...
  11. clickhouse Aggregatingmergetree表引擎
  12. 论文赏析[ACL18]直接到树:基于神经句法距离的成分句法分析
  13. 学生成绩管理系统源码
  14. 【软技能】完全写作指南--演讲
  15. Arduino入门教程(二) Unity动感单车
  16. 计算力学——有限元编程实现
  17. html转换下一页,如何转到下一页与HTML和/或JS锚?
  18. 【原创项目】GC Server 更新
  19. 【AI视野·今日NLP 自然语言处理论文速览 第十三期】Wed, 23 Jun 2021
  20. scrapy 爬取链家二手房数据

热门文章

  1. 新手攻略熔炉_【新手攻略】快速入门
  2. Qt 在designer 中给QToolBar 添加 action控件
  3. php外联样式,css外联样式不起作用怎么办
  4. 操作系统基础:存储管理知识笔记(二)
  5. 那些关于浏览器的趣图和幽默段子
  6. 美国计算机生物学要求,美国大学CS专业分支生物信息学和计算生物学专业 Bioinformatics and Computational Biology介绍...
  7. ux和ui_我怎么知道UI / UX是否适合我?
  8. 版式设计与创意 pdf_恋爱与版式
  9. 若川的 2021 年度总结,弹指之间
  10. 阿里腾讯面试梳理个人成长经历分享