Описание тега longjmp
Longjmp (и дополнительный setjmp) позволяют создавать нелокальные переходы в программах на C - по сути, это нелокальныйgoto
. Это функция, которая в основном эквивалентны исключениям в более поздних языках, и фактически используется для записи исключений, как для систем C.
Он работает, загружая состояние окружающей среды (jmp_buf
) сохраненный ранее setjmp
над текущим состоянием. В процессе он также возвращает значение на месте исходногоsetjmp
вызов. На практике состояние окружающей среды связано со стеком, и это может вызвать некоторые проблемы.
Например, если кадр, в котором setjmp
возвращается, а затем переход к этому конкретному кадру вызывает неопределенное поведение, поскольку этот кадр больше не существует. Еще одно следствиеlongjmp
заключается в том, что не происходит раскручивания стека, поэтому открытые файлы не будут закрыты, а переменные кучи не будут освобождены.
В большинстве стандартных библиотек C его можно найти в setjmp.h
. Имеется подпись вызоваvoid longjmp(jmp_buf env, int val);
Если вы не понимаете ничего из вышеперечисленного, пожалуйста , не используйте longjmp - это очень инструмент, который может вас укусить, если вы неопытны. Это особенно верно для C++, в котором есть исключения, которыми труднее злоупотреблять, чемlongjmp
является.