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é vers le site d'appel de la macro
setjmp
qui a configuré
env
. Ce
setjmp
retourne ensuite la valeur, passée en tant que
status
.
Si la fonction qui a appelé
setjmp
a terminé son exécution (que ce soit par retour ou par un autre
longjmp
plus haut dans la pile), le comportement est indéfini. En d'autres termes, seuls les sauts vers le haut de la pile d'appels sont autorisés.
|
Sauter entre les threads (si la fonction qui a appelé
|
(since C11) |
|
Si, lors de l'appel de
setjmp
, une variable de
VLA
ou un autre type à modification variable était dans la portée et que le contrôle a quitté cette portée,
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) |
Table des matières |
Paramètres
| env | - | variable faisant référence à l'état d'exécution du programme sauvegardé par setjmp |
| status | - | la valeur à retourner depuis setjmp . Si elle est égale à 0 , 1 est utilisé à la place |
Valeur de retour
(aucun)
Notes
longjmp
est destiné à gérer des conditions d'erreur inattendues où la fonction ne peut pas retourner de manière significative. Ceci est similaire à la gestion d'exceptions dans d'autres langages de programmation.
Exemple
#include <stdio.h> #include <setjmp.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 C17 (ISO/CEI 9899:2018) :
-
- 7.13.2.1 La macro longjmp (p: 191-192)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.13.2.1 La macro longjmp (p: 263-264)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.13.2.1 La macro longjmp (p : 244-245)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 4.6.2.1 Fonction longjmp
Voir aussi
|
sauvegarde le contexte
(macro de fonction) |
|
|
Documentation C++
pour
longjmp
|
|