如何调用第三个功能

问题描述:

基本上,我想做的事情后返回第一个功能是这样的:如何调用第三个功能

从一个函数void A()我调用另一个函数void B()。 B依次调用void C()函数。我怎么能在一些声明之后,从C返回到A中的最后一个被调用的行?如果我输入return,则返回B,但如果C中的语句为真,我不希望B中的代码被执行,我想以A结尾。我可以将C更改为bool C()并检查此在B中,但我宁愿不。

那么,有没有我可以使用的双返回类型? exit-keyword退出整个程序,这不是我想要做的。

+1

几乎可以肯定,你正在尝试做一些事情,可以做得更好一点,更仔细的想法。为什么不描述你试图解决的实际问题? –

+0

好的。我正在制作一个基于文本的小游戏。所以函数A基本上就是我所说的动作(),而角色反过来又是他的动作。从行动()我可以打电话战斗(),如果我想打另一个角色。战斗()是基于回合的,因此每个角色在打你打电话的战斗中转身()。在命中()我想添加一个输入选项来运行而不是战斗。当我跑我想退出斗争(),但不是行动()。 – pigelin

这是什么毛病?

void A() { 
    B(); 
} 

void B() { 
    if (!C()) return; 
    ... 
} 

bool C() { 
    .. 
} 
+0

我结束了这一个。谢谢。 – 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]:~$ 
+1

无论如何谁需要ARM:V – pezcode

+0

@pezcode:这是x86 – BlackBear

+0

@BlackBear:这是他的观点。 – dmckee

你可以做这样的事情,但我不推荐它导致有这方面的各种问题:

jmp_buf env; 

A() 
{ 
    jmp_buf env; 
    if (!setjmp(&env)) 
    { 
    B(); 
    } 
    ... 
} 

B() 
{ 
    C(); 
} 

C() 
{ 
    if (for_some_reason) 
    { 
    longjmp(&env, 1); 
    } 
} 

您已经给出了C的错误签名。它应该是bool C并返回一个“成功”指示符B然后立即返回到A或继续适当的。

+0

这也是我的想法。只是想避免它,因为我不得不改变很多代码。 – pigelin