在 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++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!