下面的代码只是打印"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,而不是任何一个函数.别担心,我没有在任何地方使用这个代码,我只是好奇而已!
发布于 2013-11-29 16:19:29
您想要做的事情在文档中被明确指定为未定义的行为。
longjmp()函数用相应的jmp_buf参数还原在同一个线程中最近调用setjmp()所保存的环境。如果没有这样的调用,或者如果包含setjmp()调用的函数在临时中终止了执行,则行为是未定义的。
由于调用setjmp (即funcB)的函数在调用funcA中的longjmp之前已经退出,因此行为是未定义的(它撞上了一个理想)。
发布于 2013-11-29 16:18:30
不能使用longjmp返回已退出的函数。换句话说,longjmp不会为您恢复堆栈。见这里。
你需要的是一种类似于计划的语言,在那里做这样的事情是完全正常的。
发布于 2013-11-29 16:22:40
您所使用的编译器似乎都使用了对setjmp和longjmp所做工作的严格解释:
这个宏可能返回不止一次:第一次,在直接调用时;在这种情况下,它总是返回零。当将信息设置为env调用longjmp时,宏将再次返回;这一次,如果与零不同,则将传递给longjmp的值作为第二个参数返回,如果值为零,则返回1。
来自这里
因为它是UB,它可以这样做,订购比萨,结束世界.任何东西都是有效的。
https://stackoverflow.com/questions/20289762
复制相似问题