setjmp.h — заголовочный файл стандартной библиотеки языка Си, объявляющий макросы и тип данных для нелокальных переходов. В Си существует оператор goto, позволяющий переходить в любое место в пределах функции (с некоторыми оговорками), однако переход между функциями с его помощью невозможен.

Типы данных Библиотека объявляет тип данных jmp_buf, который является массивом и который может использоваться для сохранения и восстановления контекста выполнения программы. Тип не включает в себя информацию о настройках дробного сопроцессора, статусе открытых файлов или иных компонентов.

Функции (макросы) #include <setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); Стандарт объявляет две функции: setjmp() (может быть макросом) и longjmp(), для сохранения и восстановления контекста, соответственно. Функция setjmp() сохраняет контекст в переменной env и возвращает 0, если это был прямой вызов, или ненулевое значение, если это был переход с помощью longjmp().

Стандарт запрещает сохранять результат выполнения функции setjmp, накладывая ограничения на место вызова.

Функция longjmp() восстанавливает состояние программы, сохраненное ранее с помощью функции setjmp(). Другими словами, после успешного вызова управление передаётся телу , которая, в свою очередь, для индикации такого хода событий возвращает значение в ту функцию, откуда вызвали. Все объекты с неавтоматическим выделением памяти сохраняют своё значение. Также сохраняют своё значение автоматические объекты с квалификатором volatile.

Аргумент val нельзя задать равным нулю. Если аргумент val задан равным нулю, ему автоматически присваивается значение 1. Если функция была вызвана без соответствующего вызова setjmp(), или вызвавшая функция уже завершилась, то поведение не определено.

Использование setjmp() и longjmp() может привести к утечкам памяти, если выделение происходит между вызовами этих функций.

Применение

Используются в одном из методов обработки исключений — SJLJ, что расшифровывается как «setjmp/longjmp». Данный механизм использовался в ранних реализациях исключений C++.

Также может применяться в кооперативной многозадачности.

Примечания