まあ、longjmp
/setjmp
を使用してコード内の別のポイントに直接ジャンプする方法があるが、私はそれがひどい考えですので、どのように言うつもりはありません。ちょうどそれが得るほど悪い。だから、良い解決策について話しましょう:-)。
最も明白な方法は、例外を使用することです。このように:
int my_fun3() {
throw 1; // could be any type...
}
int my_fun2() {
my_fun3();
}
int my_fun1() {
my_fun2();
}
int main() {
try {
my_fun1();
} catch(int n) { // catch the same type you threw...
}
}
あなたには、いくつかのバックメインに行くための理由がない場合は、この例外の乱用になると主張していることが、ケースとすることができる(例外を使用しない場合次の最も単純な方法は、my_fun2
、およびmy_fun3
の戻り値が「完了」を意味するようにすることです.int
の値が0
未満の場合は「メインに戻る」を意味します。呼び出し構造は次のようになります。
int my_fun3() {
// ...
if(some_condition) {
return -1;
}
return 0;
}
int my_fun2() {
// ...
int r = my_fun3();
if(r < 0) {
return r;
}
// ...
return 0;
}
int my_fun1() {
// ...
int r = my_fun2();
if(r < 0) {
return r;
}
// ...
return 0;
}
int main() {
my_fun1();
}
ありがとうございます。私のコードは現在これを行います(各関数からboolを返す)が、より直接的な方法があるかどうかを知りたいだけでした。しかし、あなたの大部分が示唆しているように、もう1つの方法は例外をスローすることでしたので、私は自分のコードを変更するつもりはないと思います。 –