Использование 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, а также одна из функций, использующих вызовыlongjmp
noexcept, деструктор отключает эту функцию, в зависимости от состояния оптимизатора.
В переносимом коде при longjmp
выполнении вызова правильное уничтожение объектов на основе кадров явно не гарантируется стандартом и может не поддерживаться другими компиляторами. Чтобы сообщить вам, что на уровне предупреждения 4 вызов setjmp
вызывает предупреждение C4611: взаимодействие между "_setjmp" и уничтожением объектов C++ является не переносимым.
Завершение блока, относящегося только к системам Майкрософт
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по