以下代码最终打印“5”
#include <iostream>
#include <setjmp.h>
static jmp_buf buf;
float funcB()
{
setjmp(buf);
return 1.6f;
}
int funcA()
{
longjmp(buf,5);
std::cout<<"b";
return 2;
}
int main()
{
funcB();
std::cout<<funcA();
}
但这没有任何意义,因为setjmp返回5,而不是任何一个函数...... 别担心,我在任何地方都没有使用这个代码,我只是好奇!
答案 0 :(得分:3)
您要做的是在documentation中明确指定为未定义的行为:
longjmp()
函数使用相应的setjmp()
参数恢复最近一次调用jmp_buf
所保存的环境。如果没有这样的调用,或如果包含调用setjmp()
的函数在临时中终止执行,则行为未定义。
由于调用setjmp
(即funcB
)的函数在longjmp
中调用funcA
之前已退出,因此行为未定义(it crashes on ideone)。
答案 1 :(得分:1)
您无法使用longjmp返回已退出的功能。换句话说,longjmp不会为您恢复堆栈。请参阅here。
你需要的是一种像计划这样的语言,做这种事情是完全正常的。
答案 2 :(得分:0)
您使用的任何编译器都使用对setjmp
和longjmp
所做的严格解释:
此宏可能会多次返回:第一次,直接返回 调用;在这种情况下,它总是返回零。当longjmp是 调用信息设置为env,宏再次返回;这个 如果这样,它返回传递给longjmp的值作为第二个参数 与零不同,如果为零,则为1。
来自here
因为它是UB,它可以做到这一点,订购披萨,结束世界......任何事情都是有效的。