Пространства имён
Варианты
Действия

std::longjmp

Материал из cppreference.com
< cpp‎ | utility‎ | program
 
 
 
Коммунальные услуги Программа поддержки
Программа прекращения
Оригинал:
Program termination
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
abort
exit
quick_exit(C++11)
_Exit(C++11)
Взаимодействие с окружающей средой
Оригинал:
Communicating with the environment
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Сигналы
Оригинал:
Signals
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Сигнал типа
Оригинал:
Signal types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
SIGABRT
SIGFPE
SIGILL
SIGINT
SIGSEGV
SIGTERM
Нелокальные переходы
Оригинал:
Non-local jumps
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
setjmp
longjmp
Типы
Оригинал:
Types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
jmp_buf
 
Определено в заголовочном файле <csetjmp>
void longjmp( std::jmp_buf env, int status );

Загружает контекст выполнения env, сохранённый при предыдущем вызове setjmp. Эта функция никогда не возвращает управление. Управление передаётся в место вызова макроса setjmp, которое установило значение env. Также setjmp затем возвращает значение, которое было передано как status.

Если функция, которая вызвала setjmp завершилась, поведение не определено (другими словами разрешены только прыжки вверх по стеку вызова).

Никакие деструкторы автоматических переменных не вызываются. При замене std::longjmp с throw и setjmp с catch может вызваться нетривиальный деструктор для любых автоматических объектов, поведение для таких std::longjmp не определено.

Содержание

[править] Параметры

env - Переменная, которая хранит состояние выполнение программы, которая была сохранена с помощью вызова std::setjmp
status - Значение для возврата от setjmp. Используется вместо 0, 1

[править] Возвращаемое значение

(none)

[править] Примечание

longjmp - это механизм, использовавшийся в Си для перехвата неожиданных ошибочных ситуаций, когда функция не могла вернуть никакое значение. C++ в основном для этих целей используется перехват исключений.

[править] Пример

#include <iostream>
#include <csetjmp>
 
std::jmp_buf jump_buffer;
 
[[noreturn]] void a(int count) 
{
    std::cout << "a(" << count << ") вызван\n";
    std::longjmp(jump_buffer, count+1);  // setjump() Возвратит count+1
}
 
int main()
{
    volatile int count = 0; // Локальная переменная, которая должна быть volatile при setjmp
    if (setjmp(jump_buffer) != 9) {
        a(count++);  // Это заставит выйти из setjmp()
    }
}

Вывод:

a(0) вызван
a(1) вызван
a(2) вызван
a(3) вызван
a(4) вызван
a(5) вызван
a(6) вызван
a(7) вызван
a(8) вызван

[править] См. также

Сохраняет контекст
(функция-макрос) [править]
C documentation for longjmp