Функция библиотеки 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 <stdio.h>
#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()Они предоставляют очень гибкий механизм для переходов между различными частями программы, но их нужно использовать с большой осторожностью, чтобы избежать возможных проблем и неопределённого поведения. Обычно они используются для обработки ошибок и исключений, а также для изменения потока управления в некоторых конкретных ситуациях.

Стандартная библиотека C - <setjmp.h>

Другие расширения