Когда вызывается setjmp (), система эффективно делает снимок стека вызовов и параметров. Этот снимок будет действовать до тех пор, пока пользовательский код не выйдет из блока, в котором была вызвана setjmp (); если longjmp () вызывается с этим снимком, выполнение возобновится, как если бы setjmp () возвращался в первый раз, за исключением того, что вместо возврата нуля он вернет второй параметр, переданный longjmp (). Очень важно отметить, что вызов longjmp () с недопустимым снимком может иметь очень плохие последствия. В некоторых системах такой недопустимый вызов может «работать», но может повредить систему таким образом, чтобы он впоследствии вышел из строя.
Хотя setjmp () / longjmp () иногда подходят для чистых программ на C, с помощью вызова программы setjmp () для C для создания снимка, а затем вызова некоторого кода C ++, который, в свою очередь, вызывает longjmp () для возврата к этому снимку Рецепт катастрофы. Почти все ситуации, в которых вы захотите это сделать, могут быть лучше обработаны с использованием исключений.