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)) { ..
if(setjmp(env) > 0) { ...
while(!setjmp(env)) { ...
void
). 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.
env | - | variable to save the execution state of the program to. |
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
.
#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
jumps to specified location (function) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/utility/program/setjmp