爲什麼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
更差,但我現在正在試驗,而且這段代碼可能永遠不會看到可用應用程序的燈光。