Utilisation de setjmp et longjmp
Lorsque setjmp et longjmp sont utilisés ensemble, ils fournissent un moyen d’exécuter un paramètre non local goto
. Ils sont généralement utilisés dans le code C pour passer le contrôle d’exécution à la gestion des erreurs ou code de récupération dans une routine appelée précédemment sans utiliser les conventions d’appel standard ou de retour.
Attention
Étant donné que setjmp
et longjmp
ne prennent pas en charge la destruction correcte des objets frame de pile portablement entre les compilateurs C++, et parce qu’ils peuvent dégrader les performances en empêchant l’optimisation sur les variables locales, nous ne recommandons pas leur utilisation dans les programmes C++. Nous vous recommandons d’utiliser try
et catch
de construire à la place.
Si vous décidez d’utiliser setjmp
et longjmp
dans un programme C++, incluez <également setjmp.h> ou <setjmpex.h> pour garantir une interaction correcte entre les fonctions et la gestion des exceptions structurées (SEH) ou C++.
Section spécifique à Microsoft
Si vous utilisez une option /EH pour compiler du code C++, les destructeurs pour les objets locaux sont appelés pendant le déroulement de la pile. Toutefois, si vous utilisez /EHs ou /EHsc pour compiler, et l’une de vos fonctions qui utilise des appels longjmp
noexcept, le déstructeur se déroule pour cette fonction peut ne pas se produire, en fonction de l’état de l’optimiseur.
Dans le code portable, lorsqu’un appel est exécuté, la longjmp
destruction correcte des objets basés sur des images n’est pas garantie explicitement par la norme et peut ne pas être prise en charge par d’autres compilateurs. Pour vous informer, au niveau d’avertissement 4, un appel à setjmp
l’avertissement C4611 : l’interaction entre « _setjmp » et la destruction d’objets C++ n’est pas portable.
FIN de la section spécifique à Microsoft
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour