C++ 在C++;,是否要从将结束父函数的嵌套函数中返回?

C++ 在C++;,是否要从将结束父函数的嵌套函数中返回?,c++,function,if-statement,return,break,C++,Function,If Statement,Return,Break,我希望这样的事情发生: void a(){ b() // if condition met in b(), exit out of this function also } void b(){ if(condition){ super return // also returns out of function a } } 我似乎想不出一个办法来做这件事。任何帮助都将不胜感激。谢谢 您可以通过以下任何一种方式完成 从第二个方法返回

我希望这样的事情发生:

void a(){
    b()
    // if condition met in b(), exit out of this function also
}
void b(){
    if(condition){
        super return
        // also returns out of function a
    }
}

我似乎想不出一个办法来做这件事。任何帮助都将不胜感激。谢谢

您可以通过以下任何一种方式完成

  • 从第二个方法返回布尔类型。在第一个方法中,检查返回类型,然后采取措施
  • 差不多

    void a(){
        if(b())
            return;
    }
    bool b(){
        if(condition){
            // do something
            return true;
        }
    }
    
  • 从第二个方法抛出一个异常。从调用方方法可以捕获它

  • b必须是空的吗?您可以通过以下方式正常完成:

    void a()
    {
        // if condition met in b(), exit out of this function also
        if( !b() )
        {
            return;
        }
        //continue...
    }
    bool b(){
        if(condition)
        {
            return false;
            // also returns out of function a
        }
        return true;
    }
    

    C++没有办法按你的要求去做。有4种机制可以实现类似的目标

  • 返回一个逻辑值:从b返回一个值,在a中测试并立即退出
  • 设置全局变量:在b中设置全局可访问标志,在a中测试并立即退出
  • 异常:在a的调用者中创建一个try/catch块,在b中抛出一个异常,并在a之外捕获它
  • Setjmp/longmp:在a的调用者中创建Setjmp,在b中调用longjmp
  • 这些是你的选择。您可以编写帮助程序、宏或模板,使它们更易于使用,但这是您必须选择的


    编辑:分别处理全局值和返回值


    请注意,这是一个复杂的主题,对于粗心的人来说有许多陷阱,包括在非平凡析构函数中使用longjmp的未定义行为。警告程序员

    “有例外吗?”宋元耀说brutal@AlexeyAndronov是的,这就是为什么它是“超级返回”。另外两个选择是从
    b()
    返回一个值-尽管这依赖于
    a()
    检查返回值-以及调用像
    exit()
    这样的函数,它们有效地从每个调用的函数返回,包括
    main()
    以退出程序。注意。如果调用<代码> LojJMP 会导致非平凡析构函数被跳过,则它是未定义的行为,因此只能在非常有限的C++中使用。我认为exit()不属于这个问题。