在函数调用序列中,例如:
我希望能够从函数
main() --> A() --> B()-->C();
当被调用的函数完成后,通常会返回到调用函数,例如C()
返回到B()
,然后返回到A()
等。
我想知道是否也可以直接返回到调用顺序中较早的函数,使C()
返回到main()
并跳过B()
和A()
。
如果可能,我该如何做?能否解释一下它是如何工作的,以及它在现实中何时使用。
这是我的代码
#include <stdio.h>
int A(void);
int B(void);
void main(void )
{
A();
}
int A()
{
printf("enter A()\n");
B();
printf("exit A()\n");
}
int B()
{
printf("enter B()\n");
printf("exit B()\n");
}
我希望能够从函数
B()
跳过返回到函数A()
,以便printf("exit A()\n");
不会被执行,并给我这个结果:enter A()
enter B()
exit B()
setjmp
/longjmp
,否则无法在 C 中实现。 或者B()
调用exit()
代替返回。如果这是 C++,可以使用 try/catch 和异常将堆栈展开回到main()
,如果main
已编译为支持该功能(使用try
/catch
)。 - Peter Cordesmain()
可以编译为尾调用 A,因为您将其声明为void
。此外,您的程序具有未定义的行为:您从非void
函数 A() 和 B() 的末尾掉落。而void main(void)
不是 ISO C 中有效的函数签名之一:int main(void)
是合法的。void main()
在 x86 正常编译器上可以工作,但您将只获得垃圾退出状态。 - Peter Cordes