Поделиться через


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.

См. также

Управление процессами и средойsetjmp