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 únicamente en uno de los siguientes contextos:
-
la expresión de control completa 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, siendo la expresión resultante la expresión de control completa de
if
,
switch
,
while
,
do-while
,
for
.
if (setjmp(env) > 0) { // ...
-
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)) { // ...
-
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
|
(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 desetjmp.
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) |
|
|
Documentación de C
para
setjmp
|
|