Макрос библиотеки C -setjmp()
Стандартная библиотека C - <setjmp.h>
setjmp()является стандартной библиотекой C<setjmp.h>Макрос, используемый для сохранения текущего состояния выполнения программы, чтобы в некоторый более поздний момент можно былоlongjmp()вернуться к этому состоянию.
Макрос библиотеки Cint setjmp(jmp_buf environment): Создает локальный буфер jmp_buf и инициализирует его для будущих переходов обратно к этой точке. Эта подпрограмма сохраняет среду вызова программы в буфере, на который указывает параметр env, и env будет использоваться longjmp. Если возврат происходит из прямого вызова setjmp, setjmp возвращает 0. Если возврат происходит из среды вызова программы, восстановленной longjmp, setjmp возвращает ненулевое значение.
Объявление
Ниже приведено объявление макроса setjmp().
#include <setjmp.h> int setjmp(jmp_buf env);
Параметр
env: одинjmp_bufПеременная этого типа, используемая для сохранения текущего состояния выполнения программы.
Возвращаемое значение
- if
setjmp()При прямом вызове возвращаемое значение равно 0. - if
setjmp()осуществляется черезlongjmp()То, что возвращает вызов, — этоlongjmp()ненулевое значение, заданное
Пример
Следующий пример демонстрирует использование макроса setjmp().
Пример
Давайте скомпилируем и запустим приведённую выше программу, которая выдаст следующий результат:
second main
Сценарий использования
- Обработка ошибок и исключений:
setjmp()иlongjmp()Его можно использовать для реализации простых механизмов обработки ошибок и исключений. - конечный автомат: При переходах состояний конечного автомата иногда необходимо перескакивать между разными состояниями,
setjmp()иlongjmp()можно использовать для реализации такого рода перехода состояний. - используется вместе с обработкой сигналов: В некоторых особых случаях,
setjmp()иlongjmp()Его можно использовать для выхода из обработчика сигналов.
Примечания
- Использование
setjmp()иlongjmp()Они требуют большой осторожности, поскольку могут сделать поток управления программы очень хаотичным, что приводит к коду, который трудно понимать и отлаживать. - Избегайте их использования в средах, связанных с многопоточностью или обработчиками сигналов,
setjmp()иlongjmp()потому что они могут привести к неопределённому поведению.
Итог
setjmp()иlongjmp()Они предоставляют очень гибкий механизм для переходов между разными частями программы. Хотя они очень полезны для изменения потока управления в некоторых конкретных ситуациях, на практике их нужно использовать с осторожностью, чтобы избежать возможных проблем и неопределённого поведения.