Cocos2D-x中关于do{}while(0)和CC_BREAK_IF的用法
看过cocos2d-x 自带demo的朋友相信很多人都会发现demo中用了很多do{}while(0)和CC_BREAK_IF宏.他们是做什么用的呢?
其实这个是c++中的一个技巧.
我们时常会调用某个函数来创建一个对象,但由于内存不足或其他异常情况发生时对象可能会创建失败,创建失败我们就要结束当前程序转到错误处理地方去处理错误或释放已生成的对象。
1 int* p1 = new int;
2
3 CCObject* o1 = fun1();
4 if(!o1) goto catchcode;
5
6 CCObject* o2 = fun2();
7 if(!o2) goto catchcode;
8
9 //如果代码都执行成功
10 delete p;
11 p = NULL;
12
13 //如果o1 o2有发生错误
14 catchcode:
15 delete p;
16 p = NULL;
我们可以看到,代码中用了很多goto语句.c++中虽然有goto,但却是极力不推崇这么做.因为goto一旦滥用会令程序的运行琢磨不定,给开发带来很多不必要的麻烦.这时do{}while(0) 就要出场了。
1 int* p1 = new int;
2
3 do
4 {
5 CCObject* o1 = fun1();
6 if(!o1) break;
7
8 CCObject* o2 = fun2();
9 if(!o2) break;
10 }while(0)
11
12 delete p;
13 p = NULL;
14
对比上一段代码,这段代码是不是显得简洁了许多.而宏CC_BREAK_IF的作用就是代替if(!o1) break;这样的代码,所以上面if(!o1) break;这样的代码完全可以替代为CC_BREAK_IF(!o1)。