longjmp
| Défini dans l'en-tête <setjmp.h>
|
||
void longjmp( jmp_buf env, int status );
|
(jusqu'à C11) | |
_Noreturn void longjmp( jmp_buf env, int status );
|
(depuis C11) (jusqu'à C23) |
|
[[noreturn]] void longjmp( jmp_buf env, int status );
|
(depuis C23) | |
Charge le contexte d'exécution env sauvegardé par un appel précédent à setjmp. Cette fonction ne retourne pas. Le contrôle est transféré au site d'appel de la macro setjmp qui a configuré env. Ce setjmp retourne alors la valeur passée comme status.
Si la fonction qui a appelé setjmp s'est terminée (que ce soit par un retour ou par un autre longjmp plus haut dans la pile), le comportement est indéfini. En d'autres termes, seuls les sauts longs vers le haut de la pile d'appel sont autorisés.
|
Les sauts entre threads (si la fonction qui a appelé |
(depuis C11) |
|
Si lors de l'appel à setjmp, une variable de type VLA ou un autre type modifié de manière variable était dans la portée et que le contrôle a quitté cette portée, un En remontant la pile, void g(int n)
{
int a[n]; // a may remain allocated
h(n); // does not return
}
void h(int n)
{
int b[n]; // b may remain allocated
longjmp(buf, 2); // might cause a memory leak for h's b and g's a
}
|
(depuis C99) |
Paramètres
| env | - | variable faisant référence à l'état d'exécution du programme sauvegardé par setjmp |
| status | - | la valeur à retourner par setjmp. Si elle est égale à 0, 1 est utilisé à la place
|
Notes
longjmp est destiné à la gestion des conditions d'erreur imprévues où la fonction ne peut pas retourner de manière significative. Cela est similaire à la gestion des exceptions dans d'autres langages de programmation.
Exemple
#include <setjmp.h>
#include <stdio.h>
#include <stdnoreturn.h>
jmp_buf my_jump_buffer;
noreturn void foo(int status)
{
printf("foo(%d) called\n", status);
longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}
int main(void)
{
volatile int count = 0; // modified local vars in setjmp scope must be volatile
if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
foo(++count);
}
Sortie :
foo(1) called
foo(2) called
foo(3) called
foo(4) called
Références
- Norme C23 (ISO/IEC 9899:2024) :
- 7.13.2.1 La macro longjmp (p. 283-284)
- Norme C17 (ISO/IEC 9899:2018) :
- 7.13.2.1 La macro longjmp (p. 191-192)
- Norme C11 (ISO/IEC 9899:2011) :
- 7.13.2.1 La macro longjmp (p. 263-264)
- Norme C99 (ISO/IEC 9899:1999) :
- 7.13.2.1 La macro longjmp (p. 244-245)
- Norme C89/C90 (ISO/IEC 9899:1990) :
- 4.6.2.1 La fonction longjmp
Voir aussi
| sauvegarde le contexte (macro de fonction) | |
Documentation C++ pour longjmp
| |