Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::longjmp

      From cppreference.com
      <cpp‎ |utility‎ |program
       
       
      Utilities library
       
       
      Defined in header<csetjmp>
                   void longjmp(std::jmp_buf env,int status);
      (until C++17)
      [[noreturn]]void longjmp(std::jmp_buf env,int status);
      (since C++17)

      Loads the execution contextenv saved by a previous call tosetjmp. This function does not return. Control is transferred to the call site of the macrosetjmp that set upenv. Thatsetjmp then returns the value, passed as thestatus.

      If the function that calledsetjmp has exited, the behavior is undefined (in other words, only long jumps up the call stack are allowed).

      Contents

      [edit]Extra restrictions in C++

      On top of Clongjmp, C++std::longjmp has more restricted behavior.

      If replacingstd::longjmp withthrow andsetjmp withcatch would invoke anon-trivial destructor for any automatic object, the behavior of suchstd::longjmp is undefined.

      The behavior is undefined ifstd::longjmp is called in acoroutine in a place where theco_await operator may be used.

      (since C++20)

      [edit]Parameters

      env - variable referring to the execution state of the program saved bysetjmp
      status - the value to return fromsetjmp. If it is equal to0,1 is used instead

      [edit]Return value

      (none)

      [edit]Notes

      std::longjmp is the mechanism used in C to handle unexpected error conditions where the function cannot return meaningfully. C++ generally usesexception handling for this purpose.

      [edit]Example

      Run this code
      #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

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 619C++98the wording of the extra restrictions in C++ was vagueimproved the wording
      LWG 894C++98the behavior was undefined if replacing
      std::longjmp withthrow andsetjmp with
      catch would destroy any automatic object
      the behavior is only undefined
      if a non-trivial destructor for
      any automatic object is invoked

      [edit]See also

      saves the context
      (function macro)[edit]
      C documentation forlongjmp
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/program/longjmp&oldid=148738"

      [8]ページ先頭

      ©2009-2025 Movatter.jp