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{}这中方式。
转载于:https://www.cnblogs.com/zouly/p/3828759.html
do { ....} while(0) 在宏里冗余的意义相关推荐
- do {...} while (0) 在宏定义中的作用
有篇文章解释很清楚:do {...} while (0) in macros 然后,一位女程序媛把它翻译了一遍,排版清晰,想省力的看这边.do {...} while (0) 在宏定义中的作用
- element upload预览_vue2.0 使用element-ui里的upload组件实现图片预览效果方法
1.首先我们在cli中引入element-ui 2.然后在具体的代码中放入uoload组件 点击上传 只能上传jpg/png文件,且不超过500kb 3.使用element-ui的upload组件中提 ...
- 位于0/nut文件里的'Calculated'边界条件是什么意思?【翻译】
翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-pre-processing/140984-what-does-calcul ...
- android+平板+10寸,最便宜的安卓3.0平板 宏碁10寸双核体验
[IT168 评测]何时谷歌能推出专门针对平板电脑的操作系统?这成为影响2011年Android平板电脑销售成败的最大关键.幸运的是问题已经有了答案:Android 3.0 Honeycomb成为救世 ...
- 画面测试时,图片显示时,0件与N件的意义!
我们有时,会在画面上显示一些图片. 比如说一些商品的图片. 这些商品分为不同种类,分别分组显示. 这时我们对每一组,都有测试0件,N件的意义. 意义: 测试0件,可能是这个区域中的某个逻辑控制写错了, ...
- do...while(0)在宏定义中的巧妙用法
大家都知道,do-while(condition)可以表示循环,但你有没有遇到在一些宏定义中可以不用循环的地方,也用到了 do-while.比如: #define DELETE_POINTER(p) ...
- 为什么[]==0;JavaScript里什么情况下a==!a为true呢?
原文链接 JavaScript里什么情况下a==!a为true呢? 答案是当a = []的时候,这是因为JavaScript的类型转换. 我们先来考虑这个问题,console.log([] == fa ...
- 抄笔记:尤雨溪在Vue3.0 Beta直播里聊到了这些…
前言 在 4 月 21 日晚,Vue 作者尤雨溪在哔哩哔哩直播分享了Vue.js 3.0 Beta最新进展. 以下是直播内容整理 1. 全新文档RFCs Vue.js 3.0 Beta发布后的工作重点 ...
- asp.net 2.0 中GridView里设置日期格式
在asp.net 1.0 中的datagrid 中 设置日期字段格式时用 DataFormatString="{0:yyyy-MM-dd}"即可. 在gridview 中设置 ...
最新文章
- babylonjs 分部加载模型_如何使用BabylonJS加载OBJ或STL模型
- Oracle分析函数-OLAP函数总结
- 华硕笔记本装linux系统教程视频,在新买的华硕笔记本电脑安装linux手记
- uva 10716 Evil Straw Warts Live
- html5 手机拍视频滤镜,用canvas实现图片滤镜效果附演示_html5教程技巧
- java ssm项目_JAVA项目:逝去的SSM
- 服务器报告它来自digest_【关注】服务器行业现状研究
- Android 应用开发(33)---Android程序签名打包
- Linux学习总结(64)——DBA常用的Linux命令汇总
- 《设计原本—计算机科学巨匠Frederick P. Brooks的反思》一一第 3 章 理性模型有哪些缺陷...
- clickhouse Aggregatingmergetree表引擎
- 论文赏析[ACL18]直接到树:基于神经句法距离的成分句法分析
- 学生成绩管理系统源码
- 【软技能】完全写作指南--演讲
- Arduino入门教程(二) Unity动感单车
- 计算力学——有限元编程实现
- html转换下一页,如何转到下一页与HTML和/或JS锚?
- 【原创项目】GC Server 更新
- 【AI视野·今日NLP 自然语言处理论文速览 第十三期】Wed, 23 Jun 2021
- scrapy 爬取链家二手房数据
热门文章
- 新手攻略熔炉_【新手攻略】快速入门
- Qt 在designer 中给QToolBar 添加 action控件
- php外联样式,css外联样式不起作用怎么办
- 操作系统基础:存储管理知识笔记(二)
- 那些关于浏览器的趣图和幽默段子
- 美国计算机生物学要求,美国大学CS专业分支生物信息学和计算生物学专业 Bioinformatics and Computational Biology介绍...
- ux和ui_我怎么知道UI / UX是否适合我?
- 版式设计与创意 pdf_恋爱与版式
- 若川的 2021 年度总结,弹指之间
- 阿里腾讯面试梳理个人成长经历分享