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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de