Содержание | Глава 18

Функция longjmp

#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);
}

Зависимые функции

setjmp()
Содержание | Глава 18