setjmp
|
Определено в заголовочном файле
<setjmp.h>
|
||
|
#define setjmp(env) /* implementation-defined */
|
||
Сохраняет текущий контекст выполнения в переменную
env
типа
jmp_buf
. Эта переменная может быть позже использована для восстановления текущего контекста выполнения с помощью функции
longjmp
. То есть, когда производится вызов функции
longjmp
, выполнение продолжается в точке конкретного вызова, который создал переменную
jmp_buf
, переданную в
longjmp
. В этом случае
setjmp
возвращает значение, переданное в
longjmp
.
Вызов
setjmp
должен появляться только в одном из следующих контекстов:
-
Полное управляющее выражение
if
,
switch
,
while
,
do-while
,
for
.
switch(setjmp(env)) { // ...
-
Один операнд оператора отношения или равенства, где другой операнд является целочисленным константным выражением, а результирующее выражение составляет полное управляющее выражение
if
,
switch
,
while
,
do-while
,
for
.
if(setjmp(env) > 10) { // ...
-
Операнд унарного оператора ! с результирующим выражением, составляющим полное управляющее выражение
if
,
switch
,
while
,
do-while
,
for
.
while(!setjmp(env)) { // ...
-
Полное выражение в
выражении-операторе
(возможно с приведением к
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
Смотрите также
|
переходит к указанной локации
(функция) |
|
|
C++ документация
для
setjmp
|
|