longjmp
|
Definido en el encabezado
<setjmp.h>
|
||
|
void
longjmp
(
jmp_buf
env,
int
status
)
;
|
(hasta C11) | |
|
_Noreturn
void
longjmp
(
jmp_buf
env,
int
status
)
;
|
(desde C11)
(hasta C23) |
|
|
[
[
noreturn
]
]
void
longjmp
(
jmp_buf
env,
int
status
)
;
|
(desde C23) | |
Carga el contexto de ejecución
env
guardado por una llamada previa a
setjmp
. Esta función no retorna. El control se transfiere al sitio de llamada de la macro
setjmp
que configuró
env
. Ese
setjmp
luego retorna el valor, pasado como
status
.
Si la función que llamó a
setjmp
ha finalizado (ya sea por retorno o por un
longjmp
diferente más arriba en la pila), el comportamiento es indefinido. En otras palabras, solo se permiten saltos largos hacia arriba en la pila de llamadas.
|
Saltar entre hilos (si la función que llamó
|
(since C11) |
|
Si cuando se llamó a
setjmp
, una variable de
VLA
u otro
tipo modificable variable
estaba en ámbito y el control abandonó ese ámbito,
Al ascender por la pila,
void g(int n) { int a[n]; // a may remain allocated h(n); // does not return } void h(int n) { int b[n]; // b may remain allocated longjmp(buf, 2); // might cause a memory leak for h's b and g's a } |
(desde C99) |
Contenidos |
Parámetros
| env | - | variable que hace referencia al estado de ejecución del programa guardado por setjmp |
| status | - | el valor a retornar desde setjmp . Si es igual a 0 , 1 se utiliza en su lugar |
Valor de retorno
(ninguno)
Notas
longjmp
está destinado para manejar condiciones de error inesperadas donde la función no puede retornar de manera significativa. Esto es similar al manejo de excepciones en otros lenguajes de programación.
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.2.1 La macro longjmp (p: 191-192)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.13.2.1 La macro longjmp (p: 263-264)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.13.2.1 La macro longjmp (p: 244-245)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.6.2.1 La función longjmp
Véase también
|
guarda el contexto
(macro de función) |
|
|
Documentación de C++
para
longjmp
|
|