3

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

4

3 回答 3

3

您正在尝试做的事情在文档中被明确指定为未定义的行为:

该函数使用相应的参数恢复同一线程中longjmp()最近调用 保存的环境。如果没有这样的调用,或者如果包含调用的函数在中间终止了执行,则行为未定义。setjmp()jmp_bufsetjmp()

由于调用setjmp(ie ) 的函数在funcB您调用之前已退出,因此行为未定义(它在 ideone 上崩溃)。longjmpfuncA

于 2013-11-29T16:19:29.697 回答
1

您不能使用 longjmp 返回已退出的函数。换句话说,longjmp 不会为您恢复堆栈。见这里

您需要的是一种类似方案的语言,在这种情况下做这种事情是完全正常的。

于 2013-11-29T16:18:30.427 回答
0

看来您使用的任何编译器都在严格解释什么setjmplongjmp做什么:

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

这里

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

于 2013-11-29T16:22:40.043 回答