如何调用第三个功能
基本上,我想做的事情后返回第一个功能是这样的:如何调用第三个功能
从一个函数void A()我调用另一个函数void B()。 B依次调用void C()函数。我怎么能在一些声明之后,从C返回到A中的最后一个被调用的行?如果我输入return,则返回B,但如果C中的语句为真,我不希望B中的代码被执行,我想以A结尾。我可以将C更改为bool C()并检查此在B中,但我宁愿不。
那么,有没有我可以使用的双返回类型? exit-keyword退出整个程序,这不是我想要做的。
这是什么毛病?
void A() {
B();
}
void B() {
if (!C()) return;
...
}
bool C() {
..
}
我结束了这一个。谢谢。 – pigelin
除非您使用longjmp
,否则我不认为这是C++中不可取的,它不可能直接返回到函数的直接调用方(B,在本例中)。但是,如果您想跳过B的原因是C中发生错误,并且错误只能由A处理,则可以使用例外(警告:不完整的示例;我的C++正在生锈):
#include <stdexcept>
void A() {
try {
B();
}
catch (std::exception& e) {
// You'll get here if C throws
}
}
void B() {
C();
}
void C() {
if (someCondition)
return; // Sends you to B
else
throw std::exception; // Sends you to A since B does not contain a try/catch
}
但是请做而不是对常规(非例外)控制流程使用异常;仅用于实际的错误情况。
当然可以,用一个简单的组件特技:
leave
leave
ret
基本上这一代码进入到B的堆栈帧,以获得所述的返回地址,然后从那里继续执行。示例程序(这是C,但你不介意的话,做你;)):
void C()
{
printf("Inside C...\n");
__asm__("leave");
__asm__("leave");
__asm__("ret");
}
void B()
{
printf("Calling C...\n");
C();
printf("Returned from C...\n");
}
int main()
{
B();
}
下面是输出:
[email protected]:~$ ./a.out
Calling C...
Inside C...
[email protected]:~$
你可以做这样的事情,但我不推荐它导致有这方面的各种问题:
jmp_buf env;
A()
{
jmp_buf env;
if (!setjmp(&env))
{
B();
}
...
}
B()
{
C();
}
C()
{
if (for_some_reason)
{
longjmp(&env, 1);
}
}
几乎可以肯定,你正在尝试做一些事情,可以做得更好一点,更仔细的想法。为什么不描述你试图解决的实际问题? –
好的。我正在制作一个基于文本的小游戏。所以函数A基本上就是我所说的动作(),而角色反过来又是他的动作。从行动()我可以打电话战斗(),如果我想打另一个角色。战斗()是基于回合的,因此每个角色在打你打电话的战斗中转身()。在命中()我想添加一个输入选项来运行而不是战斗。当我跑我想退出斗争(),但不是行动()。 – pigelin