void longjmp(jmp_buf, int val)
Функция longjmp() вызывает продолжение исполнения программы, начиная с точки последнего вызова функции setjmp(). Эти две функции определяют способ переходов между функциями. longjmp() функционирует путем переустановки стека в состояние, определяемое параметром envbuf, который должен был быть предварительно установлен вызовом setjmp(). Это вызывает продолжение исполнения программы, начиная с инструкции, следующей за вызовом setjmp(). Тем самым компьютер как бы обманывают, заставляют думать, что он никогда не покидал функцию, вызвавшую setjmp().
Буфер envbuf имеет тип jmp_buf, определенный в заголовочном файле setjmp.h. Буфер должен был быть предварительно установлен посредством вызова setjmp(), предшествовавшего вызову функции longjmp().
Величина val становится возвращаемым значением функции setjmp() и может быть проанализирована с целью определения, откуда был совершен длинный переход. Единственным недопустимым значением является 0.
Важно понимать, что функция longjmp() должна быть вызвана перед выходом из функции, которая вызвала setjmp(). В противном случае результат технически не определен. (Фактически возникает аварийная ситуация.)
По существу наиболее употребительным использованием longjmp() является выход из глубоко вложенных процедур при возникновении фатальной ошибки.
Следующая программа выводит «1 2 3»: #include <stdio.h> #include <setjmp.h> jmp_buf ebuf; void f2(void); int main(void) { char first=1; int i; printf("1 "); i = setjmp(ebuf); if (first) { first =! first; f2(); printf ("this will not be printed"); } printf("%d", i); return 0; } void f2(void) { printf("2 "); longjmp(ebuf, 3); }
