Почему 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
, когда дело доходит до стиля кодирования и читаемого кода, но я сейчас экспериментирую, и этот код, вероятно, никогда не увидит свет пригодного для использования приложения.