|
|
Defined in header <csetjmp> | ||
#define setjmp(env) /* implementation-defined */ | ||
Saves the current execution context into a variableenv of typestd::jmp_buf. This variable can later be used to restore the current execution context bystd::longjmp function. That is, when a call tostd::longjmp function is made, the execution continues at the particular call site that constructed thestd::jmp_buf variable passed tostd::longjmp. In that casesetjmp
returns the value passed tostd::longjmp.
The invocation ofsetjmp
must appear only in one of the following contexts:
switch(setjmp(env)){// ...
if(setjmp(env)>0){// ...
while(!setjmp(env)){// ...
setjmp(env);
Ifsetjmp
appears in any other context, the behavior is undefined.
Additionally, the behavior is undefined if | (since C++20) |
Upon return to the scope ofsetjmp
:
setjmp
, whose values are indeterminate if they have been changed since thesetjmp
invocation.Contents |
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 toenv.
Non-zero value if a non-local jump was just performed. The return value is the same as passed tostd::longjmp.
Above requirements forbid using return value ofsetjmp
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.
#include <array>#include <cmath>#include <csetjmp>#include <cstdlib>#include <format>#include <iostream> std::jmp_buf solver_error_handler; std::array<double,2> solve_quadratic_equation(double a,double b,double c){constdouble discriminant= b* b-4.0* a* c;if(discriminant<0)std::longjmp(solver_error_handler,true);// Go to error handler constdouble delta=std::sqrt(discriminant)/(2.0* a);constdouble argmin=-b/(2.0* a);return{argmin- delta, argmin+ delta};} void show_quadratic_equation_solution(double a,double b,double c){std::cout<<std::format("Solving {}x² + {}x + {} = 0...\n", a, b, c);auto[x_0, x_1]= solve_quadratic_equation(a, b, c);std::cout<<std::format("x₁ = {}, x₂ = {}\n\n", x_0, x_1);} int main(){if(setjmp(solver_error_handler)){// Error handler for solverstd::cout<<"No real solution\n";returnEXIT_FAILURE;} for(auto[a, b, c]:{std::array{1,-3,2},{2,-3,-2},{1,2,3}}) show_quadratic_equation_solution(a, b, c); returnEXIT_SUCCESS;}
Output:
Solving 1x² + -3x + 2 = 0...x₁ = 1, x₂ = 2 Solving 2x² + -3x + -2 = 0...x₁ = -0.5, x₂ = 2 Solving 1x² + 2x + 3 = 0...No real solution
jumps to specified location (function)[edit] | |
C documentation forsetjmp |