Spec-Zone.ru › C

setjmp

Определено в заголовке <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

См. также

longjmp
переход к указанному месту
(функция)
Документация C++ для setjmp

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/program/setjmp

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API