大佬教程收集整理的这篇文章主要介绍了do{}while(0)与CC_BREAK_IF的绝妙搭配,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
从一开始觉得没有必要,到觉得非常好用,我经历了大概两个月的时间,下面来总结一下什么情况下使用这种结构吧。
第一种情况:当加载文件的时候,如果加载文件失败,需要报错的时候。
当前,可以用try{}catch(){}finally{}这种结构,但是这样做会极大的增加编译后文件的大小,使用do{}while(0)加上CC_BREAK_IF就能实现一样的效果,而且不增加文件的大小。
下面是一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
bool GameScene::setScene()
CC_BREAK_IF(!nodE);
//设置按钮
@H_900_94@m_btn_SetTing = dynamic_cast<button*>(checkerboardUI->getChildByName(
"Button_SetTing"
));
//音乐按钮
CC_BREAK_IF(!m_btn_Music);
//棋盘锁
CC_BREAK_IF(!m_btn_Lock);
//棋盘图片
@H_900_94@m_Image_checkerboard = dynamic_cast<imageview*>(checkerboardUI->getChildByName(
"Image_checkerboard"
));
this
->setCampBtn();
return
true
;
false
;
}</imageview*></button*></button*></button*>
|
第二种情况:当无论如何都需要在函数最后进行清理操作的时候。
下面举一个比较典型的例子,就是在函数开头声明了一个new的指针(非智能指针),按照正常的流程,需要delete,但是我们无法保证程序会不会在中途就return了,因为后续的维护者并不知道还有这个清除操作需要执行,下面是一个对比例子:
//error
void
test()
GameScene* gamescene =
new
GameScene;
// doSomething...
if
(gamescene->getChildByTag(
111
) == nullptr)
return
;
}
// doSomething...
delete gamescene;
gamescene = nullptr;
}
//right
test1()
GameScene;
// doSomething...
CC_BREAK_IF(gamescene->getChildByTag(
) == nullptr);
// doSomething...
delete gamescene;
gamescene = nullptr;
}
|
但是这个组合也不是万能的,下面就说一个不适合这种结构的情况吧。当do{}while(0)的括号中存在循环的时候,就不适用这个组合了,因为break毕竟只能跳出一层循环,下面是一个例子:
test2()
for
(
int
i =
;i <
5
;++i)
// doSomething...
// doSomething...
"永远显示这一行日志"
);
我们希望的是,CC_BREAK_IF能跳出do{}while(0)循环,@R_696_8400@,只跳出了for循环,所以使用do{}while(0)和CC_BREAK_IF的时候,需要确保其内部不能存在其他循环,如果存在循环,还是建议使用try{}catch(){}
大佬总结
以上是大佬教程为你收集整理的do{}while(0)与CC_BREAK_IF的绝妙搭配全部内容,希望文章能够帮你解决do{}while(0)与CC_BREAK_IF的绝妙搭配所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。