Namespaces
Variants

setjmp

From cppreference.net
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 :

  1. L'expression de contrôle complète de if , switch , while , do-while , for .
    switch(setjmp(env)) { // ...
  2. 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) { // ...
  3. 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)) { // ...
  4. 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 de setjmp .

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)