Namespaces
Variants

setjmp

From cppreference.net
Определено в заголовочном файле <setjmp.h>
#define setjmp(env) /* implementation-defined */

Сохраняет текущий контекст выполнения в переменную env типа jmp_buf . Эта переменная может быть позже использована для восстановления текущего контекста выполнения с помощью функции longjmp . То есть, когда производится вызов функции longjmp , выполнение продолжается в точке конкретного вызова, который создал переменную jmp_buf , переданную в longjmp . В этом случае setjmp возвращает значение, переданное в longjmp .

Вызов setjmp должен появляться только в одном из следующих контекстов:

  1. Полное управляющее выражение if , switch , while , do-while , for .
    switch(setjmp(env)) { // ...
  2. Один операнд оператора отношения или равенства, где другой операнд является целочисленным константным выражением, а результирующее выражение составляет полное управляющее выражение if , switch , while , do-while , for .
    if(setjmp(env) > 10) { // ...
  3. Операнд унарного оператора ! с результирующим выражением, составляющим полное управляющее выражение if , switch , while , do-while , for .
    while(!setjmp(env)) { // ...
  4. Полное выражение в выражении-операторе (возможно с приведением к void ).
    setjmp(env);

Если setjmp появляется в любом другом контексте, поведение не определено.

При возврате в область действия setjmp :

  • все доступные объекты, флаги состояния чисел с плавающей запятой и другие компоненты абстрактной машины имеют те же значения, которые они имели в момент выполнения longjmp ,
  • за исключением не- volatile локальных переменных в функции, содержащей вызов setjmp , чьи значения являются неопределёнными, если они были изменены после вызова setjmp .

Содержание

Параметры

env - переменная для сохранения состояния выполнения программы.

Возвращаемое значение

0 если макрос был вызван исходным кодом и контекст выполнения был сохранен в env .

Ненулевое значение, если только что была выполнена нелокальная передача управления. Возвращаемое значение совпадает с переданным в longjmp .

Примечания

Вышеуказанные требования запрещают использование возвращаемого значения setjmp в потоке данных (например, для инициализации или присваивания объекта). Возвращаемое значение может быть использовано только в потоке управления или отброшено.

Пример

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
jmp_buf my_jump_buffer;
noreturn void foo(int status) 
{
    printf("foo(%d) called\n", status);
    longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}
int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
        foo(++count);
}

Вывод:

foo(1) called
foo(2) called
foo(3) called
foo(4) called

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.13.1.1 Макрос setjmp (стр: 191)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.13.1.1 Макрос setjmp (стр: 262-263)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.13.1.1 Макрос setjmp (стр: 243-244)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.6.1 Макрос setjmp

Смотрите также

переходит к указанной локации
(функция)