Accès rapide :
Présentation de l'entête <setjmp.h>
Exemple d'utilisation
Eléments C ISO
Extensions POSIX
La librairie <setjmp.h> propose un mécanisme de saut non local. Elle permet de sauvegarder un point d'exécution avec
setjmp, puis d'y revenir plus tard avec longjmp, même si plusieurs
appels de fonctions ont été franchis entre-temps.
Cette possibilité peut être utile pour sortir rapidement d'une séquence d'appels imbriqués, par exemple en cas d'erreur difficile à traiter localement. Il faut toutefois l'utiliser avec prudence : un saut non local ne ferme pas automatiquement les fichiers, ne libère pas les blocs mémoire alloués et ne remplace pas une gestion d'erreur structurée.
Pour utiliser les éléments proposés par cette librairie, il suffit d'inclure l'entête suivant.
#include <setjmp.h>
L'exemple suivant sauvegarde un point de reprise dans main. Une fonction plus profonde détecte ensuite une erreur et revient
directement à ce point avec longjmp.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <setjmp.h> #include <stdio.h> #include <stdlib.h> static jmp_buf recoveryPoint; static void loadModule( int id ) { if ( id == 2 ) { longjmp( recoveryPoint, id ); } printf( "Module %d chargé.\n", id ); } int main() { int errorCode = setjmp( recoveryPoint ); if ( errorCode == 0 ) { loadModule( 1 ); loadModule( 2 ); puts( "Fin normale." ); } else { printf( "Erreur détectée dans le module %d.\n", errorCode ); } return EXIT_SUCCESS; } |
Cet exemple produit le résultat suivant.
Module 1 chargé. Erreur détectée dans le module 2.
| Nom | Type | Description | Depuis |
|---|---|---|---|
| jmp_buf | type | Type tableau capable de conserver les informations nécessaires à un saut non local. | C89 |
| longjmp | fonction | Restaure l'environnement précédemment sauvegardé par setjmp. |
C89 |
| setjmp | macro | Sauvegarde l'environnement courant afin de permettre un retour ultérieur avec longjmp. |
C89 |
| __STDC_VERSION_SETJMP_H__ | macro | Macro de version de l'entête <setjmp.h>. |
C23 |
POSIX complète cet entête avec des variantes capables de sauvegarder et de restaurer le masque des signaux bloqués. Ces éléments sont utiles quand un saut non local est déclenché depuis une logique liée aux signaux.
| Nom | Type | Description | Depuis |
|---|---|---|---|
| sigjmp_buf | type | Type tableau utilisé par les variantes POSIX de sauvegarde d'environnement. | POSIX |
| siglongjmp | fonction | Restaure un environnement sauvegardé par sigsetjmp. |
POSIX |
| sigsetjmp | macro ou fonction | Sauvegarde l'environnement courant et, si demandé, le masque des signaux bloqués. | POSIX |
_setjmp et _longjmp ne sont pas documentées ici : elles ne font plus partie de POSIX Issue 8.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :