setjmp
|
Défini dans l'en-tête
<setjmp.h>
|
||
|
#define setjmp(env) /* implementation-defined */
|
||
Sauvegarde le contexte d'exécution actuel dans une variable
env
de type
jmp_buf
. Cette variable peut être utilisée ultérieurement pour restaurer le contexte d'exécution actuel via la fonction
longjmp
. C'est-à-dire que lorsqu'un appel à la fonction
longjmp
est effectué, l'exécution se poursuit au point d'appel spécifique qui a construit la variable
jmp_buf
passée à
longjmp
. Dans ce cas,
setjmp
retourne la valeur passée à
longjmp
.
L'invocation de
setjmp
doit apparaître uniquement dans l'un des contextes suivants :
-
L'expression de contrôle complète de
if
,
switch
,
while
,
do-while
,
for
.
switch(setjmp(env)) { // ...
-
Un opérande d'un opérateur relationnel ou d'égalité dont l'autre opérande est une expression constante entière, l'expression résultante constituant l'expression de contrôle complète de
if
,
switch
,
while
,
do-while
,
for
.
if(setjmp(env) > 10) { // ...
-
L'opérande d'un opérateur unaire ! dont l'expression résultante constitue l'expression de contrôle complète de
if
,
switch
,
while
,
do-while
,
for
.
while(!setjmp(env)) { // ...
-
L'expression complète d'une
instruction d'expression
(éventuellement castée en
void).setjmp(env);
Si
setjmp
apparaît dans tout autre contexte, le comportement est indéfini.
Au retour dans la portée de
setjmp
:
- tous les objets accessibles, les indicateurs d'état en virgule flottante, et les autres composants de la machine abstraite ont les mêmes valeurs que lorsqu'ils avaient lorsque longjmp a été exécuté,
-
sauf pour les variables locales non-
volatile
dans la fonction contenant l'invocation de
setjmp, dont les valeurs sont indéterminées si elles ont été modifiées depuis l'invocation desetjmp.
Table des matières |
Paramètres
| env | - | variable pour sauvegarder l'état d'exécution du programme. |
Valeur de retour
0
si la macro a été appelée par le code original et que le contexte d'exécution a été sauvegardé dans
env
.
Valeur non nulle si un saut non local vient d'être effectué. La valeur de retour est la même que celle passée à longjmp .
Notes
Les exigences ci-dessus interdisent d'utiliser la valeur de retour de
setjmp
dans un flux de données (par exemple pour initialiser ou assigner un objet avec celle-ci). La valeur de retour ne peut être utilisée que dans un flux de contrôle ou être ignorée.
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.1.1 La macro setjmp (p: 191)
- Norme C11 (ISO/IEC 9899:2011) :
-
- 7.13.1.1 La macro setjmp (p: 262-263)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.13.1.1 La macro setjmp (p: 243-244)
- Norme C89/C90 (ISO/CEI 9899:1990) :
-
- 4.6.1 La macro setjmp
Voir aussi
|
saute vers l'emplacement spécifié
(fonction) |
|
|
Documentation C++
pour
setjmp
|
|