Пока Дейкстра ругался на оператор goto (1968), Martin Richards изобрёл (в языке BCPL, 1967) механизм нелокальных переходов longjmp. Кен Томпсон и Деннис Ритчи встроили это дело сначала в язык Би, потом в Си. Идея прижилась, позже превратившись в try/catch в Си++.
Нелокальные переходы штука полезная в умелых руках. Иногда без неё не обойтись. Там есть куча подводных камней. Мне когда-то приходилось реализовывать setjmp/longjmp на разных архитектурах. Уже подзабылось маленько. Может кто и описал это дело в книжках, но где ж те книжки отыщешь. Благо имеем ИИ, можно спросить.
Вот статья с хорошим изложением темы от Клода: "Non-Local Jumps in C: Understanding setjmp and longjmp"
Целевая аудитория: программисты на C, знакомые с функциями, указателями и стеком вызовов, но ещё не сталкивавшиеся с нелокальным управлением потоком выполнения.
Цель: сформировать чёткое представление о том, как работают setjmp/longjmp, когда их следует использовать и — что не менее важно — когда их следует избегать.
Нелокальные переходы штука полезная в умелых руках. Иногда без неё не обойтись. Там есть куча подводных камней. Мне когда-то приходилось реализовывать setjmp/longjmp на разных архитектурах. Уже подзабылось маленько. Может кто и описал это дело в книжках, но где ж те книжки отыщешь. Благо имеем ИИ, можно спросить.
Вот статья с хорошим изложением темы от Клода: "Non-Local Jumps in C: Understanding setjmp and longjmp"
Целевая аудитория: программисты на C, знакомые с функциями, указателями и стеком вызовов, но ещё не сталкивавшиеся с нелокальным управлением потоком выполнения.
Цель: сформировать чёткое представление о том, как работают setjmp/longjmp, когда их следует использовать и — что не менее важно — когда их следует избегать.

no subject
Date: 2026-05-23 22:56 (UTC)no subject
Date: 2026-05-23 23:07 (UTC)no subject
Date: 2026-05-23 23:21 (UTC)Плаугера не замай!
no subject
Date: 2026-05-24 00:23 (UTC)no subject
Date: 2026-05-24 01:47 (UTC)Она и учит. Если она у Вас на полке, посмотрите на предыдущую страницу.
Despite my initial caveat, 1 present here versions of the functions set jmp and long jmp written in C. I do so only to illustrate the principles involved. Do not use this code in a serious implementation. It barely works, and then only for implementations that have special properties: • The calling environment for the calling function and other dynamically allocated storage are stored in a contiguous area at the top of the stack. • The calling environment includes all information that must be preserved by set jmp and restored by long imp. You can reliably capture this information by copying a fixed number of characters.
no subject
Date: 2026-05-24 01:05 (UTC)no subject
Date: 2026-05-24 01:15 (UTC)И только в Си++20 появился способ делать coroutines совсем переносимым образом.
https://vak.dreamwidth.org/756289.html
no subject
Date: 2026-05-24 01:51 (UTC)no subject
Date: 2026-05-24 03:00 (UTC)if (setjmp(current) == 0) longjmp(next, 1);no subject
Date: 2026-05-24 05:11 (UTC)