博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
do { ....} while(0) 在宏里冗余的意义
阅读量:5317 次
发布时间:2019-06-14

本文共 779 字,大约阅读时间需要 2 分钟。

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

你可能感兴趣的文章
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
使用命令创建数据库和表
查看>>
linux下Rtree的安装
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
【模板】对拍程序
查看>>
【转】redo与undo
查看>>
Django 模型层
查看>>
dedecms讲解-arc.listview.class.php分析,列表页展示
查看>>
安卓当中的线程和每秒刷一次
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>