setjmp
|
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:
- toda la expresión de control de if, switch, while, do-while, for.
switch (setjmp(env)) { // ...
- 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) { // ...
- 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)) { // ...
- 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 |
(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 desetjmp.
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) |
|
|
Documentación de C
para
setjmp
|
|