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

  • ifsetjmp()Lorsqu'elle est appelée directement, la valeur de retour est 0.
  • ifsetjmp()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

#include <stdio.h> #include <setjmp.h> static jmp_buf buf; void second(void) { printf("second\n"); // Afficher longjmp(buf,1); // Revenir au site d'appel de setjmp - ce qui fait que setjmp renvoie 1 } void first(void) { second(); printf("first\n"); // Il est impossible d'exécuter cette ligne. } int main() { if ( ! setjmp(buf) ) { first(); // Avant d'entrer dans cette ligne, setjmp renvoie 0 } else { // Lorsque longjmp revient en arrière, setjmp renvoie 1, donc cette ligne est exécutée. printf("main\n"); // Afficher } return 0; }

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

  • Utilisationsetjmp()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.

Bibliothèque standard C - <setjmp.h>

autres extensions