#include <setjmp.h> // <csetjmp> en C++
int setjmp( jmp_buf env );
La macro setjmp sauvegarde l'environnement courant dans l'objet jmp_buf fourni en paramètre.
Lors du premier passage, elle retourne 0. Si un appel ultérieur à longjmp restaure cet environnement,
elle retourne alors une seconde fois, avec une valeur non nulle.
Le standard C limite les endroits où setjmp peut être utilisée. En pratique, utilisez-la directement dans un test simple, par exemple
dans un if, un switch ou une boucle. Evitez de l'enfouir dans une expression complexe.
longjmp, les variables locales modifiées depuis l'appel à setjmp peuvent avoir une valeur indéterminée
si elles ne sont pas qualifiées avec volatile. C'est l'une des raisons pour lesquelles ce mécanisme doit rester exceptionnel.
jmp_buf dans lequel sauvegarder l'environnement courant.
La macro retourne 0 lors de son appel direct. Après un retour provoqué par longjmp, elle retourne la valeur transmise à
longjmp, ou 1 si cette valeur était 0.
L'exemple suivant montre la forme la plus courante : un premier passage initialise le traitement, le second passage traite l'erreur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <setjmp.h> #include <stdio.h> #include <stdlib.h> static jmp_buf recoveryPoint; static void fail() { longjmp( recoveryPoint, 42 ); } int main() { int status = setjmp( recoveryPoint ); if ( status == 0 ) { puts( "Premier passage." ); fail(); } else { printf( "Retour avec le code %d.\n", status ); } return EXIT_SUCCESS; } |
Le résultat produit est le suivant.
Premier passage. Retour avec le code 42.
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 :