Ну, есть способ перейти непосредственно к другой точке кода, используя 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_fun1
, 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();
}