Я просто хотел бы ответить на другую часть вопроса, размышляя, почему НАСА запретило бы эти функции (в основном связывая соответствующие ответы от SO). Использование setjmp
и longjmp
не рекомендуется в C ++ больше, чем в коде C, из-за неопределенного поведения в отношении автоматического уничтожения объекта , см. Этот поток SO , особенно комментариина принятый ответ:
Как правило, всякий раз, когда есть какой-либо способ выхода из области видимости в C ++ (return, throw или любой другой), компилятор помещает инструкции для вызова dtors для любых автоматических переменных, которые нуждаютсябыть уничтоженным в результате выхода из этого блока. longjmp()
просто переходит на новое место в коде, поэтому он не даст никакой возможности для вызова dtors. Стандарт на самом деле менее конкретен - стандарт не говорит, что dtors не будут вызываться - он говорит, что все ставки отменены. Вы не можете зависеть от какого-либо конкретного поведения в этом случае.
[...]
Поскольку умные указатели зависят от уничтожения, вы получите неопределенное поведение. Вполне вероятно, что это неопределенное поведение будет включать в себя пересчет не уменьшается. Вы «в безопасности», используя longjmp()
до тех пор, пока у вас нет длинного кода, который должен вызывать вызов dtors. Тем не менее, как отметил Дэвид Торнли в комментарии, setjmp()
/ longjmp()
может быть сложно использовать правильно даже в прямом C - в C ++ они совершенно опасны. Избегайте их, если это вообще возможно.
Так что же делает setjmp()
/ longjmp()
хитрым в C? Посмотрите на возможные варианты использования , мы видим, что одним из них является реализация сопрограмм. Ответ уже был дан здесь в комментариях @StoryTeler, но не могли бы вы использовать goto
для различных функций ?
Вы не можете в Standard C;метки являются локальными для одной функции.
Ближайшим стандартным эквивалентом является пара функций setjmp () и longjmp ().
Однако вы весьма ограничены setjmp
и longjmp
, и вы можете быстро столкнуться с segfault . Сокровище снова можно найти в комментариях:
Вы можете думать о longjmp()
как о «расширенном возвращении». Успешный longjmp()
работает как серия последовательных возвратов, раскручивая стек вызовов, пока не достигнет соответствующего setjmp()
. Как только кадры стека вызовов развернуты, они больше не действительны. Это в отличие от реализаций сопрограмм (например, Modula-2) или продолжений (например, Схема), где стек вызовов остается действительным после перехода в другое место. C и C ++ поддерживают только один линейный стек вызовов, , если только не использует потоки, в которых вы создаете несколько независимых стеков вызовов.