Share via


Uso de setjmp y longjmp

Cuando setjmp y longjmp se usan conjuntamente, proporcionan una manera de ejecutar una instrucción goto no local. Normalmente se usan en código de C para pasar el control de la ejecución al control de errores o al código de recuperación en una rutina invocada anteriormente sin usar las convenciones estándar de llamada o devolución.

Precaución

Dado setjmp que y longjmp no admiten la destrucción correcta de objetos de marco de pila de forma portable entre compiladores de C++, y dado que podrían degradar el rendimiento al impedir la optimización en variables locales, no se recomienda su uso en programas de C++. Se recomienda usar construcciones try y catch en su lugar.

Si decide usar setjmp y longjmp en un programa de C ++, incluya también <setjmp.h> o <setjmpex.h> para garantizar la interacción correcta entre las funciones y el control de excepciones estructurado (SEH) o el control de excepciones de C++.

Específicos de Microsoft

Si usa una opción /EH para compilar código de C++, se llama a los destructores para objetos locales durante el desenredo de la pila. Pero si usa /EHs o /EHsc para compilar y una de las funciones que usa noexcept llama a longjmp, es posible que no se produzca el desenredo del destructor para esa función, según el estado del optimizador.

En código portable, cuando se ejecuta una llamada a longjmp, el estándar no garantiza explícitamente la destrucción correcta de objetos basados en marcos y es posible que otros compiladores no la admitan. Para que se haga una idea, en el nivel de advertencia 4, una llamada a setjmp provoca la advertencia C4611, que indica que la interacción entre "_setjmp" y la destrucción de objetos de C++ no es portable.

FIN de Específicos de Microsoft

Consulte también

Mezclar excepciones de C (estructuradas) y de C++