setjmp

From cppreference.com
< cpplrm; | utilitylrm; | program
Program support utilities
Program termination
(C++11)
(C++11)
Communicating with the environment
Signals
Signal types
Non-local jumps
setjmp
Types
Defined in header <csetjmp>
#define setjmp(env) /* implementation-defined */

Saves the current execution context into a variable env of type std::jmp_buf. This variable can later be used to restore the current execution context by std::longjmp function. That is, when a call to std::longjmp function is made, the execution continues at the particular call site that constructed the std::jmp_buf variable passed to std::longjmp. In that case setjmp returns the value passed to std::longjmp.

The invocation of setjmp must appear only in one of the following contexts:

switch(setjmp(env)) { ..
  • one operand of a relational or equality operator with the other operand an integer constant expression, with the resulting expression being the entire controlling expression if, switch, while, do-while, for.
if(setjmp(env) > 0) { ...
  • the operand of a unary! operator with the resulting expression being the entire controlling expression of if, switch, while, do-while, for.
while(!setjmp(env)) { ...
setjmp(env);

If setjmp appears in any other context, the behavior is undefined.

Upon return to the scope of setjmp, all accessible objects, floating-point status flags, and other components of the abstract machine have the same values as they had when std::longjmp was executed, except for the non-volatile local variables in setjmp's scope, whose values are indeterminate if they have been changed since the setjmp invocation.

Parameters

env - variable to save the execution state of the program to.

Return value

0 if the macro was called by the original code and the execution context was saved to env.

Non-zero value if a non-local jump was just performed. The return value is the same as passed to std::longjmp.

Example

#include <iostream>
#include <csetjmp>

std::jmp_buf jump_buffer;

[[noreturn]] void a(int count) 
{
    std::cout << "a(" << count << ") called\n";
    std::longjmp(jump_buffer, count+1);  // setjmp() will return count+1
}

int main()
{
    volatile int count = 0; // modified locals in setjmp scope must be volatile
    if (setjmp(jump_buffer) != 9) { // equality against constant expression in an if
        a(++count);  // This will cause setjmp() to exit
    }
}

Output:

a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called

See also

jumps to specified location
(function)