11

这就是我想做的:

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

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


我认为该声明的这种扩展break将是对 C++11 的有用补充......

4

8 回答 8

7

怎么样

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

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

于 2012-09-07T08:43:17.827 回答
6

这是一种方法:

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

(请不要这样做)

于 2012-09-07T09:57:37.160 回答
5

这个:

{
    // ...

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

这样可以避免goto跳出一段代码。

于 2012-09-07T08:50:06.893 回答
5

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

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

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

于 2015-12-16T21:23:28.033 回答
3

这里只是一些额外的可能性:

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

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

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

于 2012-09-07T08:51:25.443 回答
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:
于 2019-12-09T10:04:17.977 回答
0

我解决了使用:

if (1) {
   if (1) goto End;
   ...
   ...
End:
   ;
}
于 2021-09-17T18:09:10.067 回答
-2

“我想要一个简单的代码块类似的东西。”

return在满足条件后使用,并将return控制权返回给调用者。

void MyWorkerClass::doWork(Item & workItem) {
    // ...
    if(noMoreWorkToDo)
        return;
    // ...
}
于 2015-12-19T03:26:55.260 回答