为什么setjmp不保存堆栈?
考虑下面的代码:为什么setjmp不能保存堆栈?
#include <iostream>
jmp_buf Buf;
jmp_buf Buf2;
void MyFunction()
{
for(int i = 0; i < 5; i++)
{
std::cout << i << std::endl;
if(!setjmp(Buf))
longjmp(Buf2, 1);
}
}
int main (int argc, const char * argv[])
{
while(true)
{
if(!setjmp(Buf2))
{
MyFunction();
break;
}
longjmp(Buf, 1);
}
return 0;
}
我除了是代码将跳转从主来回功能,每次回来印刷越来越多。
实际发生的是它无限次地打印0
然后1
。就好像它跳回到函数栈中重置为默认值一样。它为什么这样做?有什么办法可以让它保存堆栈吗?
我知道setjmp
和longjmp
在编码风格和可读代码方面比goto
更差,但我现在正在试验,而且这段代码可能永远不会看到可用应用程序的灯光。