longjmp
Restaura el entorno de la pila y la configuración regional de ejecución establecidos por una llamada a setjmp
.
Sintaxis
void longjmp(
jmp_buf env,
int value
);
Parámetros
env
Variable donde se almacena el entorno.
value
Valor que se devolverá a la llamada a setjmp
.
Comentarios
La función longjmp
restaura un entorno de pila y la configuración regional de ejecución que guardó setjmp
en env
. setjmp
y longjmp
proporcionan una manera de ejecutar un no local goto
; normalmente se usan para pasar el control de ejecución al control de errores o al código de recuperación en una rutina denominada anteriormente sin usar las convenciones normales de llamada y devolución.
Si se hace una llamada a setjmp
, el entorno de pila actual se guarda en env
. Una llamada subsiguiente a longjmp
restaura el entorno guardado y devuelve el control al punto inmediatamente posterior a la llamada setjmp
correspondiente. La ejecución se reanuda como si value
hubiera sido devuelta por la setjmp
llamada. Los valores de todas las variables (excepto las variables de registro) a las que se puede obtener acceso en la rutina que recibe el control contienen los valores que tenían cuando se llamó a longjmp
. Los valores de las variables de registro son imprevisibles. El valor devuelto por setjmp
debe ser distinto de cero. Si value
se pasa como 0, el valor 1 se sustituye en la devolución real.
Específicos de Microsoft
En el código de Microsoft C++ en Windows, longjmp
usa la misma semántica de desenredo de pila que el código de control de excepciones. Es seguro usar en los mismos lugares en los que se pueden generar excepciones de C++. Sin embargo, este uso no es portable y viene con algunas advertencias importantes.
longjmp
Llame solo a antes de la función que llamó setjmp
a devuelve; de lo contrario, los resultados son imprevisibles.
Observe las siguientes restricciones al usar longjmp
:
No suponga que los valores de las variables de registro seguirán siendo los mismos. Los valores de las variables de registro de la rutina que llama a
setjmp
podrían no restaurarse a los valores adecuados después de ejecutarlongjmp
.No use
longjmp
para transferir el control fuera de una rutina de control de interrupciones a menos que la interrupción se deba a una excepción de punto flotante. En este caso, se podría devolver un programa desde un controlador de interrupción a través delongjmp
si primero se reinicializa el paquete matemático de punto flotante mediante una llamada a_fpreset
.No use
longjmp
para transferir el control desde una rutina de devolución de llamada invocada directa o indirectamente por código de Windows.Si el código se compila mediante /EHs o /EHsc, y la función que contiene la
longjmp
llamada esnoexcept
, es posible que los objetos locales de esa función no se destruan durante el desenredado de la pila.
FIN de Específicos de Microsoft
Nota:
En el código portable de C++, no se puede asumir que setjmp
y longjmp
admiten la semántica de objetos de C++. En concreto, un par de llamadas setjmp
/longjmp
tiene un comportamiento indefinido si, al reemplazar setjmp
y longjmp
por catch
y throw
, se invocan destructores no triviales para todos los objetos automáticos. En los programas de C++, se recomienda usar el mecanismo de control de excepciones de C++.
Para obtener más información, vea Usar setjmp/longjmp.
Requisitos
Routine | Encabezado necesario |
---|---|
longjmp |
<setjmp.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
Vea el ejemplo de _fpreset
.