Стандартная библиотека языка программирования С |
|
setjmp.h — заголовочный файл стандартной библиотеки языка Си, объявляющий макросы и тип данных для нелокальных переходов[1]. В Си существует оператор goto, позволяющий переходить в любое место в пределах функции (с некоторыми оговорками), однако переход между функциями с его помощью невозможен.
Библиотека объявляет тип данных jmp_buf
, который является массивом и который может использоваться для сохранения и восстановления контекста выполнения программы. Тип не включает в себя информацию о контексте вычислений с плавающей запятой, статусе открытых файлов или иных компонентов[1].
#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
Стандарт объявляет две функции: setjmp()
(может быть макросом) и longjmp()
, для сохранения и восстановления контекста, соответственно. Функция setjmp()
сохраняет контекст в переменной env и возвращает 0, если это был прямой вызов, или ненулевое значение, если это был возврат из longjmp()
[1].
Стандарт запрещает сохранять результат выполнения функции setjmp, накладывая ограничения на место вызова.
Функция longjmp()
возвращает выполнение в точку вызова setjmp()
со значением val
. Все объекты с неавтоматическим выделением памяти сохраняют своё значение. Также сохраняют своё значение автоматические объекты с квалификатором volatile
.
Если функция была вызвана без соответствующего вызова setjmp()
, или функция, в которой восстанавливается выполнение, уже завершилась, то поведение не определено.
Использование setjmp()
и longjmp()
может привести к утечкам памяти, если выделение происходит между вызовами этих функций[1].
Используются в одном из методов обработки исключений — SJLJ, что расшифровывается как «setjmp/longjmp»[2]. Данный механизм использовался в ранних реализациях исключений C++[3].
Также может применяться в кооперативной многозадачности[4].
Эту статью следует викифицировать. |
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .