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


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

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

Предупреждение

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

Если принято решение использовать setjmp/longjmp в программе C++, необходимо также включить SETJMP.H или SETJMPEX.H, чтобы обеспечить правильное взаимодействие между функциями и обработкой исключений C++. Если /EH используется для компиляции, деструкторы для локальных объектов вызываются во время очистки стека. При использовании /EHs для компиляции, если одна из функций вызывает функцию, которая использует nothrow, и функция, которая использует nothrow, вызывает longjmp, очистка деструкторов может не произойти в зависимости от оптимизатора.

В переносимом коде при выполнении нелокального оператора goto, вызывающего longjmp, правильное удаление основанных на кадре объектов может быть ненадежным.

См. также

Ссылки

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