в учебник Nextpeer Вы можете увидеть такой код:
CCScene* GameLayer::scene() {
CCScene * scene = NULL;
do {
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
GameLayer *layer = GameLayer::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
Каково значение do-while
заблокировать в этом коде?
CC_BREAK_IF
это макрос для if(condition) break
, (Изменить: я подтвердил, что это.)
Это идиома, используемая для структурированного перехода:
do {
if (!condition0) break;
action0();
if (!condition1) break;
action1();
} while(0);
do...while(0);
существует только для того, чтобы оператор break мог пропустить часть кода.
Это будет похоже на:
if (!condition0) goto end;
action0();
if (!condition1) goto end;
action1();
end:
За исключением того, что избегает использования goto.
Использование любого из этих идиом состоит в том, чтобы избежать вложенного if
:
if (condition0) {
action0();
if (condition1) {
action1();
}
}
В C и C ++ break
Оператор работает только в определенных контекстах: while
, do
/while
или же for
петля или в switch
заявление. CC_BREAK_IF
макрос предположительно выполняет break
если условие выполнено. Это простой метод для обработки исключительных / ошибочных состояний в C (обработка исключений для бедного человека, если хотите).
do
/while
цикл, который никогда не зацикливается, просто обеспечивает контекст для break
заявления на работу.
Смысл сделать CC_BREAK_IF
операторы работают правильно, то есть разорвать цикл и перейти к return scene;
,
Это распространенный метод, когда у вас есть несколько условных операторов, которые в противном случае приводили бы к цепочке if
/else
статьи. Вместо этого вы используете один итерационный цикл и используете break
операторы для выхода из цикла (CC_BREAK_IF
это, вероятно, макрос, который проверяет выражение и break
если правда).