Использование setjmp и longjmp

Если setjmp и longjmp используются вместе, они предоставляют способ выполнения не локальногоgoto. Обычно они используются в коде C для передачи управления выполнением в обработку ошибок или код восстановления в ранее называемой подпрограмме без использования стандартных соглашений о вызове или возврате.

Внимание

Поскольку setjmp и longjmp не поддерживают правильное уничтожение объектов кадра стека, переносимое между компиляторами C++ и поскольку они могут снизить производительность, предотвращая оптимизацию локальных переменных, мы не рекомендуем использовать их в программах C++. Вместо этого рекомендуется использовать try и catch создавать конструкции.

Если вы решили использовать setjmp и longjmp в программе C++, также включите <setjmp.h или <setjmpex.h>>, чтобы обеспечить правильное взаимодействие между функциями и обработкой исключений структурированного исключения (SEH) или C++ .

Блок, относящийся только к системам Майкрософт

При использовании параметра /EH для компиляции кода C++ деструкторы для локальных объектов вызываются во время очистки стека. Однако если для компиляции используется /EHs или /EHsc, а также одна из функций, использующих вызовыlongjmpnoexcept, деструктор отключает эту функцию, в зависимости от состояния оптимизатора.

В переносимом коде при longjmp выполнении вызова правильное уничтожение объектов на основе кадров явно не гарантируется стандартом и может не поддерживаться другими компиляторами. Чтобы сообщить вам, что на уровне предупреждения 4 вызов setjmp вызывает предупреждение C4611: взаимодействие между "_setjmp" и уничтожением объектов C++ является не переносимым.

Завершение блока, относящегося только к системам Майкрософт

См. также

Сочетание исключений C (структурированные) и C++