怎么样从被调函数结束全部流程,但又使程序不退出

C语言 码拜 8年前 (2017-04-18) 1352次浏览
怎么样从被调函数结束全部流程,但又使程序不退出
如:“程序1”的程序界面“按钮1”, 会调用很多函数,函数里又调用一些函数。其中某个(子)被调函数 需要进行条件判断。不满足就需要结束“按钮1”的功能,而不是结束整个“程序1”。
return 会返回到上层函数继续运行。exit()又会退出整个程序进程(假如还有其他线程或窗口界面就糟了)
上一层函数,虽然可以用 被调函数 return 的返回值 来进行判断 能否也跟着return
但是个人认为这样,假如主函数分支非常多的时候。每一层都要设置个return的值,并对返回值做判断。非常麻烦!
有没有什么办法能让被调函数自身来结束这一切(当然不能启动线程和强制终止线程)
解决方案

20

可以抛出一个异常,然后在希望退到的那个函数里捕获这个异常

20

仅供参考:

#include <iostream>
using namespace std;
struct MyStruct {
    int Nodedata;
    MyStruct *pLeft;
    MyStruct *pRight;
} s1,s2,s3,s4,s5,s6,s7,s8;
void ashow(MyStruct * p) {
    if (p != nullptr) {
        ashow(p->pLeft);
        ashow(p->pRight);
        cout << p->Nodedata << endl;
        if (p->Nodedata == 4) {
            throw 1;//退出递归.直接返回.
        }
    }
}
int main() {
    MyStruct *pRoot;//根
    pRoot = &s1;
    s1.Nodedata = 1;
    s2.Nodedata = 2;
    s3.Nodedata = 3;
    s4.Nodedata = 4;
    s5.Nodedata = 5;
    s6.Nodedata = 6;
    s7.Nodedata = 7;
    s8.Nodedata = 8;
    s1.pLeft = &s2;
    s1.pRight = &s3;
    s2.pLeft = &s4;
    s2.pRight = &s5;
    s3.pLeft = &s6;
    s3.pRight = &s7;
    try {
        ashow(pRoot);
    } catch (int err) {
        cout<<"catch err "<<err<<endl;
    }
    return 0;
}
//4
//catch err 1
//

再供参考:

#include <stdio.h>
#include <setjmp.h>
jmp_buf mark;
int i=0;
void c() {
    printf( "c in\n");
    if (1==i%2) longjmp( mark, i );
    printf( "c out\n");
}
void b() {
    printf( "b in\n");
    c();
    printf( "b out\n");
}
void a() {
    printf( "a in\n");
    b();
    printf( "a out\n");
}
void main( void )
{
   int jmpret;
   jmpret = setjmp( mark );
   printf( "Start %d\n",jmpret);
   if( jmpret == 0 ) {
       printf( "First\n");
       a();
       i++;
       a();
   } else {
       printf( "Second\n");
   }
}
//Start 0
//First
//a in
//b in
//c in
//c out
//b out
//a out
//a in
//b in
//c in
//Start 1
//Second
//

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么样从被调函数结束全部流程,但又使程序不退出
喜欢 (0)
[1034331897@qq.com]
分享 (0)