1

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このコードのブロックの意味は何ですか?

4

4 に答える 4

5

CC_BREAK_IFのマクロですif(condition) break(編集: であることを確認しました。)

これは、構造化された goto に使用されるイディオムです。

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();
    }
}
于 2014-11-10T19:34:35.740 に答える
2

C および C++ では、breakステートメントは選択コンテ​​キスト ( whiledo/whileまたはforループ、またはswitchステートメント内) でのみ機能します。条件が満たされた場合、マクロCC_BREAK_IFはおそらく a を実行します。breakこれは、C で例外/エラー条件を処理するための簡単な方法です (貧乏人の例外処理です)。

決してループしないdo/ループは、ステートメントが機能するためのコンテキストを提供するだけです。whilebreak

于 2014-11-10T19:41:20.943 に答える
1

意味は、CC_BREAK_IFステートメントが正しく機能するようにすることです。つまり、ループを破って にジャンプしreturn scene;ます。

于 2014-11-10T19:31:47.723 に答える
0

これは、複数の条件付きステートメントがある場合に一般的な方法であり、それ以外の場合は一連のif/else句になります。代わりに、単一の反復ループを使用し、breakステートメントを使用してループを終了します(CC_BREAK_IFおそらく、式をテストし、真かどうかをテストするマクロbreakです)。

于 2014-11-10T19:33:17.160 に答える