从一开始觉得没有必要,到觉得非常好用,我经历了大概两个月的时间,下面来总结一下什么情况下使用这种结构吧。
第一种情况:当加载文件的时候,如果加载文件失败,需要报错的时候。
当前,可以用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
|
@H_502_83@
如果在中途出现任何一个变量执行后还是nullptr,那么就CC_BREAK_IF,然后显示错误日志,最后返回false给上层函数进行处理。这样的处理方式是不是既优雅又方便快速,又避免了可能错误使用空指针。
第二种情况:当无论如何都需要在函数最后进行清理操作的时候。
下面举一个比较典型的例子,就是在函数开头声明了一个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;
}
|