如何跳出C ++代码块?

时间:2012-09-07 08:41:18

标签: c++ block break goto

这就是我想做的事情:

{
    ...
    if(condition)
        break;
    ...
}

这适用于循环。对于一个简单的代码块,我想要类似的东西。 有可能吗?
我被迫使用" goto"?


我认为break语句的这种扩展对C ++ 11来说是一个有用的补充......

7 个答案:

答案 0 :(得分:4)

怎么样

do
{
    ...
    if(condition)
        break;
    ...
}
while (0);

我不是特别喜欢这种风格,但我以前见过它。如果重构是不可能的(可能是一个巨大的块,如果更改可以打破很多东西),这是一个选项。

答案 1 :(得分:4)

这一个:

{
    // ...

    if (!condition)
    {
        // ...
    }
}

这将避免goto跳出一段代码。

答案 2 :(得分:4)

这是一种方式:

switch(0) {
default:
    /* code */
    if (cond) break;
    /* code */
}

(请不要这样做)

答案 3 :(得分:3)

这里还有一些其他的可能性:

for(..)
{
    continue;//next loop iteration
}

void mymethod()
{
    ...
    return;
    ...
}

你可能应该为有问题的代码块创建子方法,如果你想使用goto并通过return的使用留下代码块。

答案 4 :(得分:3)

C ++ 11 中,实现此目的的最佳方法是使用匿名lambda函数并将break替换为return

[&](){
    ...
    if(condition)
        return;
    ...
 }();

请注意,[&]会通过引用捕获所有变量,如果您不使用任何变量,只需将其替换为[]

答案 5 :(得分:1)

恐怕我现在正在释放编码神的怒气,但是这个不错的讨厌的宏可以帮助人们比以前更轻松地做到这一点(基于@jleahy的回答):

//example use:
// { __breakable__
//    ...
//    if (condition)
//        break;
//    ...
//    if (condition2)
//        break;
//    ...
// }
//WARNING: use only with a standalone block. To make if, try or catch block
//         breakable use double braces
//         if (cond) {{ __breakable__ ... }}
//         try {{ __breakable__ ... }} catch (...) {{ __breakable__ ... }}
#define __breakable__ }switch(0){default:

答案 6 :(得分:-1)

"对于一个简单的代码块,我想要类似的东西。"

在满足条件后使用return,并return控制回来。

void MyWorkerClass::doWork(Item & workItem) {
    // ...
    if(noMoreWorkToDo)
        return;
    // ...
}