这就是我想做的:
{
...
if(condition)
break;
...
}
这适用于循环。对于一个简单的代码块,我想要类似的东西。可能吗?
我是否被迫使用“goto”?
我认为该声明的这种扩展break
将是对 C++11 的有用补充......
怎么样
do
{
...
if(condition)
break;
...
}
while (0);
我不是特别喜欢这种风格,但我以前见过。如果重构是不可能的(可能是一个巨大的块,如果改变会破坏很多东西),这是一个选项。
这是一种方法:
switch(0) {
default:
/* code */
if (cond) break;
/* code */
}
(请不要这样做)
这个:
{
// ...
if (!condition)
{
// ...
}
}
这样可以避免goto
跳出一段代码。
在C++11中,实现此目的的最佳方法是使用匿名 lambda 函数并替换break
为return
[&](){
...
if(condition)
return;
...
}();
请注意,[&]
通过引用捕获所有变量,如果您不使用任何变量,只需将其替换为[]
这里只是一些额外的可能性:
for(..)
{
continue;//next loop iteration
}
void mymethod()
{
...
return;
...
}
如果您想使用 goto 并通过使用 return 离开代码块,您可能应该为有问题的代码块创建子方法。
恐怕我现在正在对我释放编码之神的愤怒,但是这个漂亮的讨厌的宏可以帮助人们比以前更容易做到这一点(基于@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:
我解决了使用:
if (1) {
if (1) goto End;
...
...
End:
;
}
“我想要一个简单的代码块类似的东西。”
return
在满足条件后使用,并将return
控制权返回给调用者。
void MyWorkerClass::doWork(Item & workItem) {
// ...
if(noMoreWorkToDo)
return;
// ...
}