longjmp
Восстанавливает среду стека и языковой стандарт выполнения, заданный вызовом setjmp
.
Синтаксис
void longjmp(
jmp_buf env,
int value
);
Параметры
env
Переменная, в которой хранится среда.
value
Значение, возвращаемое в вызов setjmp
.
Замечания
Функция longjmp
восстанавливает среду стека и языковой стандарт выполнения, которые ранее были сохранены в параметре env
функцией setjmp
. setjmp
и longjmp
предоставляет способ выполнения нелокального goto
; обычно они используются для передачи управления выполнением в обработку ошибок или код восстановления в ранее называемой подпрограмме без использования обычных соглашений о вызове и возврате.
Вызов функции setjmp
сохраняет текущую среду стека в параметре env
. Последующий вызов функции longjmp
восстанавливает сохраненную среду и возвращает управление в точку, следующую сразу за соответствующим вызовом функции setjmp
. Выполнение возобновляется, как будто value
было возвращено вызовом setjmp
. Все переменные (за исключением регистровых переменных), доступные для получившей управление подпрограммы, содержат те значения, которые они имели при вызове функции longjmp
. Значения регистровых переменных непредсказуемы. Значение, возвращаемое функцией setjmp
, должно быть ненулевым. Если value
значение 0 передается как 0, значение 1 заменяется фактическим возвратом.
Блок, относящийся только к системам Майкрософт
В коде Microsoft C++ в Windows longjmp
используется та же семантика стека, что и код обработки исключений. Безопасно использовать в том же месте, что и исключения C++. Однако это использование не является переносимым и поставляется с некоторыми важными предостережениями.
longjmp
Вызов выполняется только до того, как функция, вызываемая setjmp
возвращается; в противном случае результаты непредсказуемы.
При использовании функции longjmp
соблюдайте следующие ограничения:
Не предполагайте, что значения регистровых переменных останутся неизменными. Значения регистровых переменных, установленные на момент вызова подпрограммы
setjmp
, после вызоваlongjmp
могут измениться.Не используйте
longjmp
для передачи управления из подпрограммы обработки прерываний, если прерывание не вызвано исключением с плавающей запятой. В этом случае программа может выполнять возврат из обработчика прерываний посредством функцииlongjmp
, если она сначала повторно инициализирует пакет вычислений с плавающей запятой путем вызова функции_fpreset
.Не используйте
longjmp
для передачи управления из подпрограммы обратного вызова, вызываемой непосредственно или косвенно кодом Windows.Если код компилируется с помощью /EHs или /EHsc, а функция, содержащая
longjmp
вызов, тоnoexcept
локальные объекты в этой функции могут не быть деструктированы во время очистки стека.
Завершение блока, относящегося только к системам Майкрософт
Примечание.
В переносимом коде C++ нельзя предполагать setjmp
и longjmp
поддерживать семантику объектов C++. В частности, setjmp
/longjmp
пара вызовов не определена при замене setjmp
и longjmp
вызове catch
throw
любых нетривиальных деструкторов для любых автоматических объектов. В программах C++ рекомендуется использовать механизм обработки исключений C++.
Дополнительные сведения см. в разделе Использование setjmp и longjmp.
Требования
Маршрут | Обязательный заголовок |
---|---|
longjmp |
<setjmp.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
Пример см. в примере _fpreset
.