#include <setjmp.h> // <csetjmp> en C++
void longjmp( jmp_buf env, int value );
La fonction longjmp restaure l'environnement sauvegardé par le dernier appel correspondant à
setjmp. L'exécution reprend alors comme si l'appel à setjmp venait de retourner une seconde fois.
La valeur value devient la valeur de retour apparente de setjmp. Si cette valeur vaut 0, le standard impose que
setjmp retourne finalement 1, afin de distinguer le premier passage du retour provoqué par longjmp.
longjmp n'exécute pas les instructions intermédiaires de nettoyage. Il faut donc éviter de l'utiliser au-dessus de code
qui possède des ressources à libérer, sauf si une stratégie claire de nettoyage a été prévue.
setjmp.setjmp. Si cette valeur vaut 0, setjmp retournera 1.
Cette fonction ne rend pas la main à son appelant. Depuis C23, la déclaration standard utilise l'attribut [[noreturn]] pour rendre
cette propriété explicite.
L'exemple suivant utilise longjmp pour remonter directement une erreur détectée dans une fonction appelée plus profondément.
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 |
#include <setjmp.h> #include <stdio.h> #include <stdlib.h> static jmp_buf recoveryPoint; static void checkValue( int value ) { if ( value < 0 ) { longjmp( recoveryPoint, value ); } printf( "Valeur acceptée : %d\n", value ); } int main() { int result = setjmp( recoveryPoint ); if ( result == 0 ) { checkValue( 12 ); checkValue( -4 ); } else { printf( "Valeur rejetée : %d\n", result ); } return EXIT_SUCCESS; } |
Le résultat produit est le suivant.
Valeur acceptée : 12 Valeur rejetée : -4
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 :