为什么这个setjmp程序打印5?

时间:2013-11-29 16:15:38

标签: c++ setjmp

以下代码最终打印“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,而不是任何一个函数...... 别担心,我在任何地方都没有使用这个代码,我只是好奇!

3 个答案:

答案 0 :(得分:3)

您要做的是在documentation中明确指定为未定义的行为:

  

longjmp()函数使用相应的setjmp()参数恢复最近一次调用jmp_buf所保存的环境。如果没有这样的调用,或如果包含调用setjmp()的函数在临时中终止执行,则行为未定义。

由于调用setjmp(即funcB)的函数在longjmp中调用funcA之前已退出,因此行为未定义(it crashes on ideone)。

答案 1 :(得分:1)

您无法使用longjmp返回已退出的功能。换句话说,longjmp不会为您恢复堆栈。请参阅here

你需要的是一种像计划这样的语言,做这种事情是完全正常的。

答案 2 :(得分:0)

您使用的任何编译器都使用对setjmplongjmp所做的严格解释:

  

此宏可能会多次返回:第一次,直接返回   调用;在这种情况下,它总是返回零。当longjmp是   调用信息设置为env,宏再次返回;这个   如果这样,它返回传递给longjmp的值作为第二个参数   与零不同,如果为零,则为1。

来自here

因为它是UB,它可以做到这一点,订购披萨,结束世界......任何事情都是有效的。