我有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()
添加一些条件才能实现此目标?
答案 0 :(得分:4)
好吧,有一种方法可以使用longjmp
/ setjmp
直接跳转到代码中的另一个点,但我不会告诉你怎么做,因为它是可怕的< / strong>想法。差不多一样糟糕。那么让我们谈谈好的解决方案: - )。
最明显的方法是使用例外。像这样:
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
,其值小于{{ 1}}表示“回到主要”。您的呼叫结构如下所示:
0
答案 1 :(得分:3)
是的,可以通过抛出异常并在main
中捕获它来实现。但请不要将异常用作一般控制流机制,这不是他们的目的。
还有setjmp
/ longjmp
,但使用它们的代码非常难以理解。
答案 2 :(得分:3)
从所有函数返回或抛出并捕获异常(不推荐,除非上升的原因是错误情况)
答案 3 :(得分:0)
没有滥用例外的干净方法将是
#define EXITCONDITION 42
void main ()
{
...
myfunc1 ();
...
}
int myfunc1 ()
{
...
if (myfunc2 () == EXITCONDITION) return EXITCONDITION;
...
}
int myfunc2 ()
{
...
if (myfunc3 () == EXITCONDITION) return EXITCONDITION;
...
}
int myfunc3 ()
{
...
if (somethingweirdhappens) retrun EXITCONDITION;
...
}
答案 4 :(得分:0)
似乎你可能暗示goto
这是不好的。
没有看到程序的结构,你可以考虑一个返回布尔值(例如一个标志),它从函数#3返回时检查,在#2中检查,然后返回,在#1中检查,并且然后返回main()
。
答案 5 :(得分:0)
有可能通过抛出异常,就像larsmans所说的那样(尽管只有C ++)。它也可以通过setjmp()/ longjmp()来实现,它充当一种跨函数的goto语句。
但如果这真的是你想要/需要的设计,那么你的设计可能有问题。在my_fun1和my_fun2中有条件可能是这里的“正确”答案,但这取决于你正在做什么。如果您发布更多关于您可能需要/需要的信息,我们可能会帮助您更好。
答案 6 :(得分:0)
将第一个函数调用放在循环中。无论如何,这是一种普遍接受的编程方法。
main
while running
do stuff
所以你可以做到
bool running = false;
int main(int argc, char **argv)
{
while(running)
function1();
}
void function3()
{
...
if(whatever)
{
running = true;
return;
}
...
}
如果你需要function1()和function2()根据这种行为中止某些事情,那么你的情况要么是一个错误,要么基本上就像一个错误,所以抛出异常会是一个更好的解决方案。即使它不是错误,它仍然基本上是相同类型的控制逻辑。
但是,如果这是程序的非错误控制流程,您可能希望更多地查看结构并找出导致您需要这样做的原因并尝试避免导致此问题的任何逻辑