Функция библиотеки C -longjmp()
Стандартная библиотека C - <setjmp.h>
Описание
Функции библиотеки Cvoid longjmp(jmp_buf environment, int value)Восстанавливает окружение, сохранённое последним вызовомsetjmp()в окружение, сохранённое при вызове макроса,jmp_bufНастройка параметра формируется предыдущим вызовом setjmp().
longjmp()является стандартной библиотекой C<setjmp.h>функция, используемая для нелокальных переходов. Она позволяет программе переходить между несколькими кадрами стека; обычно используется для обработки ошибок или исключений, а также для изменения потока управления в некоторых конкретных ситуациях.
Объявление
Ниже приведено объявление функции longjmp().
#include <setjmp.h> void longjmp(jmp_buf env, int val);
Параметр
env: одинjmp_bufпеременная типа, которая хранитsetjmp()информация о возврате.val: целочисленное значение, какsetjmp()возвращаемое значение.
Возвращаемое значение
Сама функция longjmp() не имеет возвращаемого значения, но она передаёт поток управления программы в место, где ранее был вызван setjmp(), и делает val возвращаемым значением setjmp().
Пример
В следующем примере демонстрируется использование функции longjmp().
Пример
#include <setjmp.h>
static jmp_buf buf;
void second(void) {
printf("second\n"); // Печать
longjmp(buf,1); // Возврат к месту вызова setjmp - при этом setjmp возвращает 1
}
void first(void) {
second();
printf("first\n"); // Эту строку невозможно выполнить.
}
int main() {
if ( ! setjmp(buf) ) {
first(); // Перед входом в эту строку setjmp возвращает 0
} else { // Когда longjmp совершает обратный переход, setjmp возвращает 1, поэтому управление передаётся этой строке.
printf("main\n"); // Вывод
}
return 0;
}
Давайте скомпилируем и запустим приведённую выше программу, которая выдаст следующий результат:
second main
Примечания
- Использование
longjmp()иsetjmp()Их следует использовать с осторожностью, потому что они могут затруднить понимание и отладку кода, особенно в больших программах. longjmp()Они могут обходить обычную очистку ресурсов и вызовы деструкторов, что может привести к утечкам ресурсов и неопределённому поведению.- Их следует избегать в средах, связанных с многопоточностью или обработчиками сигналов.
longjmp()иsetjmp()。
Сценарий использования
- Обработка ошибок и исключений:
longjmp()иsetjmp()Их можно использовать для реализации простых механизмов обработки ошибок и исключений. - Конечные автоматы: при переходах между состояниями в конечном автомате иногда необходимо переходить между различными состояниями.
longjmp()иsetjmp()может использоваться для реализации этого типа перехода состояния. - Используется вместе с обработкой сигналов: в некоторых особых случаях,
longjmp()иsetjmp()их можно использовать для выхода из обработчиков сигналов.
Итог
longjmp()иsetjmp()Они предоставляют очень гибкий механизм для переходов между различными частями программы, но их нужно использовать с большой осторожностью, чтобы избежать возможных проблем и неопределённого поведения. Обычно они используются для обработки ошибок и исключений, а также для изменения потока управления в некоторых конкретных ситуациях.