Compartir a través de


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 ejecutar longjmp.

  • 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 de longjmp 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 es noexcept, 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.

Consulte también

Control de procesos y entornossetjmp