31-07-2023
Стандартная библиотека языка программирования С |
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]
Setjmp.h.