#include <setjmp.h> void longjmp(jmp_buf envbuf, int status);
Функция longjmp() возобновляет выполнение программы с места последнего обращения к функции setjmp(). Таким образом, функции longjmp() и setjmp() предоставляют средство передачи управления между функциями. Обратите внимание на необходимость включения заголовка <setjmp.h>.
Функция longjmp() восстанавливает состояние стека, сохраненное в буфере envbuf с помощью функции setjmp(). В результате выполнение программы возобновляется с оператора, следующего за вызовом функции setjmp(). Иначе говоря, компьютер "вводится в заблуждение": "он считает", будто управление программой не выходило за пределы функции, которая вызвала функцию setjmpt(). (Выражаясь образно, функция longjmp() подобна многомерной машине пространства-времени. Она позволяет путешествовать во времени, не соблюдая какой бы то ни было последовательности событий: с ее помощью можно вернуться в "покинутый мир", не обращая внимания на то, что предварительно должен был быть произведен выход из вызванных функций. С ее помощью можно "вернуться домой", минуя промежуточные пункты. Она "искривляет" время и пространство (памяти) так, что с ее помощью можно попасть в покинутую точку программы, не выполняя нормальный процесс возврата из функции.)
Буфер evnbuf имеет тип jmp_buf, который определен в заголовке <setjmp.h>. Этот буфер должен быть заполнен в результате обращения к функции setjmp() еще до вызова функции longjmp().
Значение параметра status становится возвращаемым значением функции setjmp(), и оно используется для того, чтобы определить "происхождение длинного перехода". Единственным недопустимым значением является нуль. Функция setjmp() возвращает нуль в том случае, когда она вызывается непосредственно программой, а не косвенно, т.е. путем выполнения функции longjmp().
Функция longjmp() используется в основном для возврата из глубоко вложенного набора функций при возникновении ошибок.
Эта программа печатает
1 2 3
#include <setjmp.h> #include <stdio.h> jmp_buf ebuf; void f2(void); int main(void) { int i; printf("1 "); i = setjmp(ebuf); if(i == 0) { f2(); printf("Это не будет напечатано."); } printf("%d", i); return 0; } void f2(void) { printf("2 "); longjmp(ebuf, 3); }