То, что вы пытаетесь достичь с помощью своего кода, здесь не определено.
Цитирование C11
, глава §7.13.2.1p2
Функция longjmp
восстанавливает среду, сохраненную при последнем вызове setjmp
макрос в том же вызове программы с соответствующим аргументом jmp_buf.Если такого вызова не было, или если вызов был из другого потока выполнения, или если функция, содержащая вызов макроса setjmp
, прекратила выполнение в промежуточный период, или если вызовмакрос setjmp
находился в области действия идентификатора с изменяемым типом, и выполнение оставило эту область в промежуточном состоянии, поведение не определено.
Выделение шахты
Относительно того, что считается завершенным исполнением:
Цитирование C11
, глава §note248
Например, путем выполнения оператора возврата или потому чтодругой вызов longjmp
вызвал переход к вызову setjmp
в функции ранее в наборе вложенных вызовов.
Итак, сначала вы вызываете a()
, и он вызывает b()
после установки a_buf
.Теперь b()
устанавливает b_buf
и возвращается к a
.На этом этапе выполнение b
было прекращено, и если вы вернетесь к b_buf
, поведение будет неопределенным.
Одним из возможных решений вашей проблемы может быть определение функций a_step()
и b_step()
, которые выполняют только один шаг a()
и b()
соответственно.Затем назовите их альтернативно в цикле.