Participer au site avec un Tip
Rechercher
 

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 :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

Fonction longjmp

Le type jmp_buf La macro setjmp


Entête à inclure

#include <setjmp.h>  // <csetjmp> en C++

Fonction longjmp

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.

Un appel à 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.

Paramètres

Valeur de retour

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.

Exemple de code

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;
}
Exemple d'utilisation de la fonction longjmp

Le résultat produit est le suivant.

Valeur acceptée : 12
Valeur rejetée : -4

Sujets connexes

<setjmp.h>
jmp_buf
setjmp
siglongjmp


Le type jmp_buf La macro setjmp




Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé