从用户定义的函数转到 main()

A-A*_*A-A 1 c++ program-entry-point function break

我有3个功能:my_fun1()my_fun2(),和my_fun3()

main()调用my_fun1()哪个调用my_fun2(),哪个调用又调用my_fun3()

根据 中的一些预定义条件my_fun3(),我希望我的程序直接返回到调用main()行的函数my_fun1()

是否有可能直接去my_fun3()main()呢,还是有一些条件增加my_fun2()my_fun1()实现这一目标?

Eva*_*ran 5

嗯,有一种方法可以使用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...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不想使用异常(可能是这种情况,有些人可能会争辩说,如果返回 main的原因不是“异常” ,这将是对异常的滥用),下一个最直接的方法是使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();
}
Run Code Online (Sandbox Code Playgroud)