setjmp
|
Definido en el encabezado
<setjmp.h>
|
||
|
#define setjmp(env) /* implementation-defined */
|
||
Guarda el contexto de ejecución actual en una variable
env
de tipo
jmp_buf
. Esta variable puede usarse posteriormente para restaurar el contexto de ejecución actual mediante la función
longjmp
. Es decir, cuando se realiza una llamada a la función
longjmp
, la ejecución continúa en el sitio de llamada particular que construyó la variable
jmp_buf
pasada a
longjmp
. En ese caso
setjmp
devuelve el valor pasado a
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) > 10) { // ...
-
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.
Al regresar al ámbito de
setjmp
:
- todos los objetos accesibles, las banderas de estado de punto flotante y otros componentes de la máquina abstracta tienen los mismos valores que tenían cuando 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 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 <stdio.h> #include <setjmp.h> #include <stdnoreturn.h> jmp_buf my_jump_buffer; noreturn void foo(int status) { printf("foo(%d) called\n", status); longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp } int main(void) { volatile int count = 0; // modified local vars in setjmp scope must be volatile if (setjmp(my_jump_buffer) != 5) // compare against constant in an if foo(++count); }
Salida:
foo(1) called foo(2) called foo(3) called foo(4) called
Referencias
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.13.1.1 La macro setjmp (p: 191)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.13.1.1 The setjmp macro (p: 262-263)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.13.1.1 The setjmp macro (p: 243-244)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.6.1 La macro setjmp
Véase también
|
salta a la ubicación especificada
(función) |
|
|
Documentación de C++
para
setjmp
|
|