Namespaces
Variants

setjmp

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación a tres vías
(C++20)
(C++20) (C++20) (C++20)    
(C++20) (C++20) (C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
 
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 solo en uno de los siguientes contextos:

  1. toda la expresión de control 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, con la expresión resultante siendo toda la expresión de control de if, switch, while, do-while, for.
    if (setjmp(env) > 0) { // ...
    
  3. el operando de un operador unario  ! con la expresión resultante siendo toda la expresión de control de if, switch, while, do-while, for.
    while (!setjmp(env)) { // ...
    
  4. toda la expresión de una sentencia de expresión (posiblemente convertida a void).
    setjmp(env);
    

Si setjmp aparece en cualquier otro contexto, el comportamiento no está definido.

Adicionalmente, el comportamiento no está definido si setjmp se invoca en una corrutina en un lugar donde el operador co_await pueda usarse.

(desde C++20)

Al regresar al ámbito de setjmp:

  • todos los objetos accesibles, los indicadores de estado de coma flotante y otros componentes de la máquina abstracta tienen los mismos valores que tenían cuando se ejecutó std::longjmp,
  • 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.

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)