在 C++ 中,是不是可以从将结束父函数的嵌套函数中返回?

Posted

技术标签:

【中文标题】在 C++ 中,是不是可以从将结束父函数的嵌套函数中返回?【英文标题】:In C++, is there to return out of a nested function that will end the parent function?在 C++ 中,是否可以从将结束父函数的嵌套函数中返回? 【发布时间】:2016-07-27 20:28:35 【问题描述】:

我希望这样的事情发生:

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
    

我似乎想不出办法来做到这一点。任何帮助,将不胜感激。谢谢!

【问题讨论】:

抛出异常? @songyuanyao 太残忍了 @AlexeyAndronov 是的,这就是为什么它是“超级回报”。 【参考方案1】:

您可以通过以下任何一种方式进行操作

    从第二种方法返回布尔类型。在第一个方法中检查返回类型然后采取行动。

类似

void a()
    if(b())
        return;

bool b()
    if(condition)
        // do something
        return true;
    

    从第二种方法抛出异常。您可以从调用者方法中捕获它。

【讨论】:

【参考方案2】:

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;

【讨论】:

【参考方案3】:

C++ 中无法完全按照您的要求进行操作。提供了 4 种机制,您可以通过它们实现类似的目标。

    返回一个逻辑值:从b返回一个值,在a中测试并立即退出。 设置全局变量:在 b 中设置全局可访问标志,在 a 中测试并立即退出。 异常:在 a 的调用者中创建一个 try/catch 块,在 b 中抛出异常并在 a 之外捕获它。 setjmp/longmp:在a的调用者中创建setjmp,在b中调用longjmp。

这些都是你的选择。您可以编写帮助程序或宏或模板以使其更易于使用,但这是您必须选择的。


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

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

【讨论】:

另外两个选择是从 b() 返回一个值 - 尽管这依赖于 a() 检查返回值 - 并调用像 exit() 这样的函数 - 它有效地从每个被调用函数返回,包括 @ 987654324@ 以退出程序。 注:如果调用 longjmp 导致重要的析构函数被跳过,这是未定义的行为,因此它只能在 C++ 中以非常有限的方式使用。 Tnx:见编辑。我认为 exit() 不在问题范围内。

以上是关于在 C++ 中,是不是可以从将结束父函数的嵌套函数中返回?的主要内容,如果未能解决你的问题,请参考以下文章

C和C++是不是都可以函数嵌套调用,但是不能函数嵌套定义?

从嵌套类的函数访问父级的非静态成员

在 Python 中嵌套函数时是不是有开销?

C++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!

从将传递 jslint 的同一对象中的函数调用另一个函数的正确方法是啥?

如何在嵌套函数中调用父变量