std::longjmp(3)
π std::longjmp π
okay bestie, welcome to the std::longjmp(3) page from the C++ Standard Libary manual. This is the whole vibe: it's a jump, it's long, and it does not come back. Buckle up. π
β¨ NAME β¨
std::longjmp β literally std::longjmp. That's the name. Slay. π
π SYNOPSIS π
Here's the synopsis, bestie:
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)
Okay so std::longjmp loads the execution context env saved by a previous call to setjmp. This function does not return. Control is transferred to the call site of the macro setjmp that set up env. That setjmp then returns the value, passed as the status.
π¨ warning, bestie: if the function that called setjmp has exited, the behavior is undefined. In other words, only long jumps up the call stack are allowed. Do not try to jump back into a function that's already gone. That's a no. π
π§Έ PARAMETERS π§Έ
envβ variable referring to the execution state of the program saved bysetjmp.statusβ the value to return fromsetjmp. If it is equal to0,1is used instead.
π RETURN VALUE π
(none) β literally no return value, bestie. It does not return. Periodt. π
π NOTES π
std::longjmp is the mechanism used in C to handle unexpected error conditions where the function cannot return meaningfully. C++ generally uses exception handling for this purpose.
So yeah: in C, this is the "get me out of here" button. In C++, it's more like "bestie, we usually use exceptions for this." Both exist. Know the difference. π¦
π§ͺ EXAMPLE π§ͺ
Run this code, bestie:
// 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)
{
const double discriminant = b * b - 4.0 * a * c;
if (discriminant < 0)
std::longjmp(solver_error_handler, true); // Go to error
handler
const double delta = std::sqrt(discriminant) / (2.0 * a);
const double 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 solver
std::cout << "No real solution\n";
return EXIT_FAILURE;
}
for (auto [a, b, c] : {std::array{1, -3, 2}, {2, -3, -2}, {1, 2,
3}})
show_quadratic_equation_solution(a, b, c);
return EXIT_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
π DEFECT REPORTS π
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
- DR
LWG 619, applied to C++98 β Behavior as published: the wording of the extra restrictions in C++ was vague. Correct behavior: improved the wording. - DR
LWG 894, applied to C++98 β Behavior as published: the behavior was undefined if replacingstd::longjmpwiththrowandsetjmpwithcatchwould destroy any automatic object. Correct behavior: the behavior is only undefined if a non-trivial destructor for any automatic object is invoked.
π SEE ALSO π
setjmpβ saves the context (function macro).- C documentation for
longjmp.
source/version/date vibe check: this page comes from http://cppreference.com, dated 2024.06.10, and it's the std::longjmp(3) page. Bye bestie, go make good jumps only upward! πβ¨π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms