Fonction de la bibliothèque C -longjmp()

Bibliothèque standard C - <setjmp.h>

Description

Fonctions de la bibliothèque Cvoid longjmp(jmp_buf environment, int value)Restaure l'environnement sauvegardé par l'appel le plus récentsetjmp()vers l'environnement sauvegardé lorsque la macro a été invoquée,jmp_bufLe paramètre est généré par un appel précédent à setjmp().

longjmp()est la bibliothèque standard C<setjmp.h>une fonction utilisée pour les sauts non locaux. Elle permet au programme de sauter entre plusieurs cadres sur la pile, généralement utilisée pour la gestion des erreurs ou des exceptions, ainsi que pour des changements de flux de contrôle dans certaines situations spécifiques.

Déclaration

Voici la déclaration de la fonction longjmp().

#include <setjmp.h>

void longjmp(jmp_buf env, int val);

Paramètre

  • env: unjmp_bufune variable de type, qui stockesetjmp()informations de retour.
  • val: une valeur entière, commesetjmp()la valeur de retour de.

Valeur de retour

La fonction longjmp() elle-même n'a aucune valeur de retour, mais elle transfère le flux de contrôle du programme vers l'emplacement où setjmp() a été appelée précédemment, et fait de val la valeur de retour de setjmp().

Exemple

L'exemple suivant montre l'utilisation de la fonction longjmp().

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 - faire en sorte 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

Notes

  • Utilisationlongjmp()etsetjmp()Elles doivent être utilisées avec prudence, car elles peuvent rendre le code difficile à comprendre et à déboguer, en particulier dans les grands programmes.
  • longjmp()Elles peuvent contourner le nettoyage standard des ressources et les appels de destructeurs, ce qui peut entraîner des fuites de ressources et un comportement indéfini.
  • Elles doivent être évitées dans les environnements impliquant le multithreading ou les gestionnaires de signaux.longjmp()etsetjmp()。

Cas d'utilisation

  • Gestion des erreurs et gestion des exceptions :longjmp()etsetjmp()Elles peuvent être utilisées pour implémenter des mécanismes simples de gestion des erreurs et des exceptions.
  • Machines à états : Lors des transitions d'état dans une machine à états, il est parfois nécessaire de sauter entre différents états.longjmp()etsetjmp()peut être utilisé pour implémenter ce type de transition d'état.
  • Utilisé conjointement avec la gestion des signaux : Dans certains cas particuliers,longjmp()etsetjmp()ils peuvent être utilisés pour sortir des gestionnaires de signaux.

Résumé

longjmp()etsetjmp()Ils offrent un mécanisme très flexible pour effectuer des sauts entre différentes parties d'un programme, mais ils doivent être utilisés avec la plus grande prudence afin d'éviter des problèmes potentiels et un comportement indéfini. Ils sont généralement utilisés pour la gestion des erreurs et des exceptions, ainsi que pour modifier le flux de contrôle dans certaines situations spécifiques.

Bibliothèque standard C - <setjmp.h>

autres extensions