首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个setjmp程序打印一个5?

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

Stack Overflow用户
提问于 2013-11-29 16:15:37
回答 3查看 152关注 0票数 3

下面的代码只是打印"5“

代码语言:javascript
复制
#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,而不是任何一个函数.别担心,我没有在任何地方使用这个代码,我只是好奇而已!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-29 16:19:29

您想要做的事情在文档中被明确指定为未定义的行为。

longjmp()函数用相应的jmp_buf参数还原在同一个线程中最近调用setjmp()所保存的环境。如果没有这样的调用,或者如果包含setjmp() 调用的函数在临时中终止了执行,则行为是未定义的。

由于调用setjmp (即funcB)的函数在调用funcA中的longjmp之前已经退出,因此行为是未定义的(它撞上了一个理想)。

票数 3
EN

Stack Overflow用户

发布于 2013-11-29 16:18:30

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

你需要的是一种类似于计划的语言,在那里做这样的事情是完全正常的。

票数 1
EN

Stack Overflow用户

发布于 2013-11-29 16:22:40

您所使用的编译器似乎都使用了对setjmplongjmp所做工作的严格解释:

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

来自这里

因为它是UB,它可以这样做,订购比萨,结束世界.任何东西都是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20289762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档