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érie | Variables et description |
|---|---|
| 1 | jmp_buf
|
Macros de bibliothèque
Ce qui suit est la seule macro définie dans cette bibliothèque :
| Numéro de série | Macros & Description |
|---|---|
| 1 | int 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érie | Fonctions et description |
|---|---|
| 1 | void 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 <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és
setjmp()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
- Utilisation
setjmp()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'appel
setjmp()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.