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 |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/program/setjmp