C/Appendice/Librerie standard/setjmp.h

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search
CopertinaC/Copertina
IndiceC/Indice

setjmp.h è un'intestazione definita nella libreria C standard per fornire salti non-locali, o flusso di controllo, al posto della solita sequenza di chiamata a funzione e ritorno. La coppia di funzioni setjmp e longjmp forniscono questa funzionalità. Prima setjmp salva l'ambiente della funzione chiamante mettendolo in una struttura dati, e dopo longjmp può utilizzare questa struttura per "saltare" indietro.

Un uso tipico di setjmp/longjmp è per la gestione delle eccezioni, chiamando longjmp, permettendo al programma di uscire da chiamate a funzioni pluri-nidificate senza doversi preoccupare di impostare variabili di controllo per ogni funzione.

Funzioni[modifica]

Prototipo Descrizione
int setjmp(jmp_buf env)
Imposta il buffer locale jmp_buf e lo inizializza per il salto. Questa routine salva l'ambiente di chiamata del programma nel buffer di ambiente specificato con l'argomento env per un utilizzo successivo da parte longjmp. Se il valore di ritorno è di una chiamata diretta, setjmp restituisce 0. Se viene da una chiamata a longjmp, setjmp restituisce un valore diverso da 0.
void longjmp(jmp_buf env, int value)
Ripristina il contesto del buffer ambiente env che è stato salvato dalla invocazione della funzione setjmp. Se non c'è un'invocazione a setjmp o la funzione che contiene setjmp ha terminato, il comportamento è indefinito. Se longjmp è chiamata da un gestore di segnali nidificato il comportamento non è definito. Il valore specificato da value è passato da longjmp a setjmp. Dopo che longjmp ha finito, l'esecuzione del programma prosegue come se l'invocazione corrispondente a setjmp abbia appena ritornato value. Se il valore passato a longjmp è 0, setjmp si comporterà come se fosse ritornato 1, in caso contrario, essa si comporta come se fosse ritornato value.

Dopo che setjmp ha salvato lo stato corrente in jmp_buf, una chiamata a longjmp può trasferire il controllo al punto subito dopo la chiamata a setjmp. Il valore di ritorno di setjmp indica se setjmp viene chiamata direttamente o da longjmp.

Un uso tipico è un contollo del tipo:

if (setjmp()) {...}

.

Esempio[modifica]

#include <stdio.h>
#include <setjmp.h>
 
jmp_buf buf;
 
void fn2(void) {
    printf("fn2\n");      // stampa
    longjmp(buf,1);       // salta indietro dove setjmp è stata chiamata - ora setjmp ritorna 1
}
 
void fn1(void) {
    fn2();
    printf("fn1\n");      // non stampa
}
 
int main(void) {   
    if (!setjmp(buf)) 
        fn1();            // una volta eseguito, setjmp ritorna 0
    else                  // quando longjmp salta indietro, setjmp ritorna 1
        printf("main\n"); // stampa
    return 0;
}