Bibliothèque standard C -<setjmp.h>

Introduction

setjmp.hLe fichier d'en-tête définit les macrossetjmp(), la fonctionlongjmp()et les types de variablesjmp_buf, ce type de variable contourne les règles normales d'appel et de retour de fonction.

<setjmp.h>est un fichier d'en-tête de la bibliothèque standard C qui fournit un ensemble de fonctions et de macros pour les sauts non locaux (c'est-à-dire sauter d'une fonction à une autre fonction précédemment appelée, sans nécessiter le mécanisme normal de retour de fonction). Ce mécanisme est généralement utilisé pour la gestion des erreurs, la gestion des exceptions ou pour sortir de boucles profondément imbriquées ou de récursion.

Variables de la bibliothèque

La liste suivante répertorie les variables définies dans le fichier d'en-tête setjmp.h :

Numéro de sérieVariables et description
1jmp_buf

jmp_bufest un type de données utilisé pour sauvegarder l'environnement d'appel, y compris le pointeur de pile, le pointeur d'instruction, les registres, etc. Lors de l'exécutionsetjmp()lorsque, ces informations d'environnement seront sauvegardées dansjmp_bufdans des variables du type.

Macros de bibliothèque

Ce qui suit est la seule macro définie dans cette bibliothèque :

Numéro de sérieMacros & Description
1int setjmp(jmp_buf environment)
Cette macro enregistre l'environnement actuel dans la variableenvironmentafin que la fonctionlongjmp()puisse l'utiliser plus tard. Si cette macro retourne directement d'un appel de macro, elle renvoie zéro, mais si elle retourne d'unlongjmp()appel de fonction, elle renvoie une valeur non nulle.

Fonctions de bibliothèque

Voici la seule fonction définie dans le fichier d'en-tête setjmp.h :

Numéro de sérieFonctions et description
1void longjmp(jmp_buf environment, int value)
Cette fonction restaure l'environnement enregistré lors de l'appel le plus récent àsetjmp()quand la macro a été invoquée,jmp_bufLe réglage du paramètre est généré par un appel précédent à setjmp().

Exemple

L'exemple suivant montre comment utiliser setjmp() et longjmp() pour implémenter des sauts non locaux :

Exemple

#include <stdio.h>
#include <setjmp.h>

jmp_buf env;

void second() {
    printf("Entering second()\n");
    longjmp(env, 1);
    printf("This line will never be executed\n");
}

void first() {
    printf("Entrée dans first()\n");
    if (setjmp(env) == 0) {
        printf("Appel de second() depuis first()\n");
        second();
    } else {
        printf("Retour à first() depuis second() en utilisant longjmp\n");
    }
    printf("Sortie de first()\n");
}

int main() {
    printf("Démarrage de main()\n");
    first();
    printf("Sortie de main()\n");
    return 0;
}

L'exécution du programme ci-dessus affichera quelque chose comme ce qui suit :

Starting main()
Entering first()
Calling second() from first()
Entering second()
Returned to first() from second() using longjmp
Exiting first()
Exiting main()

Explication du code

  • jmp_buf env: définir une variable pour sauvegarder les informations d'environnementenv。
  • first()fonction: callsetjmp(env)sauvegarder les informations sur l'environnement actuel, et décider si l'appeler en fonction de sa valeur de retoursecond()fonction.
  • second()fonction: calllongjmp(env, 1), revenir àsetjmp(env), et lui faire renvoyer 1.
  • main()fonction: callfirst()fonction.

Cas d'utilisation

  • Gestion des erreurs: utilisée dans des appels de fonctions profondément imbriquéssetjmp()etlongjmp()pour implémenter un mécanisme de gestion des erreurs.
  • Gestion des exceptions: utilisée pour implémenter une gestion simple des exceptions.
  • interrompre le flux de contrôle: dans certains cas, le flux de contrôle normal peut être interrompu pour sortir de plusieurs niveaux de boucles imbriquées ou d'appels de fonctions.

Notes

  • Utilisationsetjmp()etlongjmp()Il faut être prudent, car elles sautent le processus normal de déroulement de la pile, ce qui peut entraîner des fuites de ressources (comme de la mémoire non libérée, des fichiers non fermés, etc.).
  • éviter lors de l'appelsetjmp()etlongjmp()entre la modification de variables locales, car cela peut entraîner un comportement indéfini.
  • Les sauts non locaux peuvent rendre le code difficile à lire et à déboguer, ils doivent donc être utilisés avec prudence.

Résumé

<setjmp.h>fournitsetjmp()etlongjmp()fonctions utilisées pour implémenter des sauts non locaux. Ces fonctions sont très utiles dans la gestion des erreurs et des exceptions, mais doivent être utilisées avec prudence pour éviter des problèmes potentiels.

autres extensions