Namespaces
Variants

setjmp

From cppreference.net
Utilities library
Definido en el encabezado <csetjmp>
#define setjmp(env) /* implementation-defined */

Guarda el contexto de ejecución actual en una variable env de tipo std::jmp_buf . Esta variable puede usarse posteriormente para restaurar el contexto de ejecución actual mediante la función std::longjmp . Es decir, cuando se realiza una llamada a la función std::longjmp , la ejecución continúa en el sitio de llamada particular que construyó la variable std::jmp_buf pasada a std::longjmp . En ese caso setjmp devuelve el valor pasado a std::longjmp .

La invocación de setjmp debe aparecer únicamente en uno de los siguientes contextos:

  1. la expresión de control completa de if , switch , while , do-while , for .
    switch (setjmp(env)) { // ...
  2. un operando de un operador relacional o de igualdad con el otro operando siendo una expresión constante entera, siendo la expresión resultante la expresión de control completa de if , switch , while , do-while , for .
    if (setjmp(env) > 0) { // ...
  3. el operando de un operador unario ! siendo la expresión resultante la expresión de control completa de if , switch , while , do-while , for .
    while (!setjmp(env)) { // ...
  4. la expresión completa de una sentencia de expresión (posiblemente convertida a void ).
    setjmp(env);

Si setjmp aparece en cualquier otro contexto, el comportamiento es indefinido.

Adicionalmente, el comportamiento es indefinido si setjmp es invocado en una coroutine en un lugar donde el operador co_await puede ser utilizado.

(since C++20)

Al regresar al ámbito de setjmp :

  • todos los objetos accesibles, indicadores de estado de punto flotante y otros componentes de la máquina abstracta tienen los mismos valores que tenían cuando std::longjmp fue ejecutado,
  • excepto por las variables locales no volatile en la función que contiene la invocación de setjmp , cuyos valores son indeterminados si han sido modificados desde la invocación de setjmp .

Contenidos

Parámetros

env - variable para guardar el estado de ejecución del programa

Valor de retorno

0 si la macro fue llamada por el código original y el contexto de ejecución fue guardado en env .

Valor distinto de cero si se acaba de realizar un salto no local. El valor de retorno es el mismo que se pasó a std::longjmp .

Notas

Los requisitos anteriores prohíben utilizar el valor de retorno de setjmp en flujo de datos (por ejemplo, para inicializar o asignar un objeto con él). El valor de retorno solo puede usarse en flujo de control o descartarse.

Ejemplo

#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); // Ir al manejador de errores
    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))
    {
        // Manejador de errores para el solver
        std::cout << "No hay solución real\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;
}

Salida:

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 hay solución real

Véase también

salta a la ubicación especificada
(función)