Следующий код просто заканчивает тем, что печатал «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, а не функцию …
Не волнуйтесь, я нигде не использую этот код, мне просто любопытно!
То, что вы пытаетесь сделать, определено как неопределенное поведение в документация:
longjmp()
функция восстанавливает среду, сохраненную последним вызовомsetjmp()
в той же теме, с соответствующимjmp_buf
аргумент. Если такого вызова нет, или если функция, содержащая вызовsetjmp()
прекратил исполнение в промежуточный период, поведение не определено.
Так как функция, которая называется setjmp
(Т.е. funcB
) вышел, прежде чем позвонить longjmp
в funcA
поведение не определено (он падает на ideone).
Вы не можете использовать longjmp для возврата к функции, которую вы вышли. Другими словами, longjmp не восстановит для вас стек. Увидеть Вот.
То, что вам нужно, это схема, похожая на язык, где такие вещи были бы совершенно нормальными.
Похоже, какой бы компилятор вы не использовали, он использует строгую интерпретацию того, что setjmp
а также longjmp
делать:
Этот макрос может возвращаться более одного раза: первый раз по прямой
призывание; В этом случае он всегда возвращает ноль. Когда longjmp
вызывается с информацией, установленной в env, макрос возвращается снова; этот
время он возвращает значение, переданное longjmp в качестве второго аргумента, если это
отличается от нуля или 1, если это ноль.
От Вот
Поскольку это UB, он может сделать это, заказать пиццу, покончить с миром … все будет в силе.