これが私がやりたいことです:
{
...
if(condition)
break;
...
}
これはループで機能します。単純なコードブロックにも似たようなものが欲しいのですが。出来ますか?
「goto」を使用する必要がありますか?
このようなステートメントの拡張は、break
C++11への便利な追加だったと思います...
どうですか
do
{
...
if(condition)
break;
...
}
while (0);
私はこのスタイルが特に好きではありませんが、以前に見たことがあります。リファクタリングが問題外の場合(変更すると多くのものを壊す可能性のある大規模なブロックの場合もあります)、これはオプションです。
これが1つの方法です:
switch(0) {
default:
/* code */
if (cond) break;
/* code */
}
(絶対にしないでください)
これです:
{
// ...
if (!condition)
{
// ...
}
}
goto
これにより、コードのブロックから飛び出すことが回避されます。
C ++ 11では、これを実現するための最良の方法は、無名ラムダ関数を使用して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;
// ...
}