Namespaces
Variants
Views
Actions

setjmp

From cppreference.com
< cpp‎ | utility‎ | program
 
 
Utilities library
General utilities
Date and time
Function objects
Formatting library (C++20)
(C++11)
Relational operators (deprecated in C++20)
Integer comparison functions
(C++20)
Swap and type operations
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Common vocabulary types
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

Elementary string conversions
(C++17)
(C++17)
 
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 of 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 the function containing the invocation of setjmp, whose values are indeterminate if they have been changed since the setjmp invocation.

Contents

[edit] Parameters

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

[edit] 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.

[edit] Notes

Above requirements forbid using return value of setjmp in data flow (e.g. to initialize or assign an object with it). The return value can only be either used in control flow or discarded.

[edit] 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

[edit] See also

jumps to specified location
(function) [edit]
C documentation for setjmp