Macro de la bibliothèque C -setjmp()
Bibliothèque standard C - <setjmp.h>
setjmp()est la bibliothèque standard C<setjmp.h>Une macro utilisée pour sauvegarder l'état d'exécution actuel du programme afin qu'à un moment ultérieur il puisselongjmp()revenir à cet état.
Macro de la bibliothèque Cint setjmp(jmp_buf environment): Crée un tampon jmp_buf local et l'initialise pour de futurs sauts de retour à ce point. Cette sous-routine enregistre l'environnement d'appel du programme dans le tampon pointé par le paramètre env, et env sera utilisé par longjmp. Si elle revient d'un appel direct à setjmp, setjmp renvoie 0. Si elle revient d'un environnement d'appel de programme restauré par longjmp, setjmp renvoie une valeur non nulle.
Déclaration
Ci-dessous se trouve la déclaration de la macro setjmp().
#include <setjmp.h> int setjmp(jmp_buf env);
Paramètre
env: unjmp_bufUne variable de ce type, utilisée pour sauvegarder l'état d'exécution actuel du programme.
Valeur de retour
- if
setjmp()Lorsqu'elle est appelée directement, la valeur de retour est 0. - if
setjmp()se fait vialongjmp()Ce que l'appel renvoie est lalongjmp()valeur non nulle définie par
Exemple
L'exemple suivant démontre l'utilisation de la macro setjmp().
Exemple
Compilons et exécutons le programme ci-dessus, ce qui produira le résultat suivant :
second main
Cas d'utilisation
- Gestion des erreurs et gestion des exceptions:
setjmp()etlongjmp()Il peut être utilisé pour implémenter des mécanismes simples de gestion des erreurs et des exceptions. - machine à états: Dans les transitions d'état d'une machine à états, il est parfois nécessaire de sauter entre différents états,
setjmp()etlongjmp()peut être utilisé pour implémenter ce type de transition d'état. - utilisé conjointement avec la gestion des signaux: Dans certains cas particuliers,
setjmp()etlongjmp()Il peut être utilisé pour sortir d'un gestionnaire de signaux.
Notes
- Utilisation
setjmp()etlongjmp()Ils exigent une grande prudence car ils peuvent rendre le flux de contrôle du programme très chaotique, ce qui produit du code difficile à comprendre et à déboguer. - Évitez de les utiliser dans des environnements impliquant du multithreading ou des gestionnaires de signaux,
setjmp()etlongjmp()car ils peuvent entraîner un comportement indéfini.
Résumé
setjmp()etlongjmp()Ils fournissent un mécanisme très flexible pour sauter entre différentes parties d'un programme. Bien qu'ils soient très utiles pour modifier le flux de contrôle dans certaines situations spécifiques, ils doivent être utilisés avec prudence en pratique afin d'éviter des problèmes potentiels et un comportement indéfini.