longjmp
Ripristina l'ambiente dello stack e le impostazioni locali di esecuzione impostate da una setjmp
chiamata.
Sintassi
void longjmp(
jmp_buf env,
int value
);
Parametri
env
Variabile in cui è archiviato l'ambiente.
value
Valore da restituire alla chiamata di setjmp
.
Osservazioni:
La funzione longjmp
ripristina un ambiente dello stack e le impostazioni locali di esecuzione precedentemente salvati in env
da setjmp
. setjmp
e longjmp
forniscono un modo per eseguire un oggetto non locale goto
. In genere vengono usati per passare il controllo dell'esecuzione al codice di gestione degli errori o di ripristino in una routine chiamata in precedenza senza usare le normali convenzioni di chiamata e restituzione.
Una chiamata a setjmp
causa il salvataggio dell'ambiente corrente dello stack in env
. Una chiamata successiva a longjmp
ripristina l'ambiente salvato e restituisce il controllo al punto immediatamente successivo alla chiamata setjmp
corrispondente. L'esecuzione riprende come se value
fosse stata restituita dalla setjmp
chiamata. I valori di tutte le variabili (eccetto le variabili di registro) accessibili per la routine che riceve il controllo contengono i valori esistenti al momento della chiamata di longjmp
. I valori delle variabili di registro sono imprevedibili. Il valore restituito da setjmp
deve essere diverso da zero. Se value
viene passato come 0, il valore 1 viene sostituito nella restituzione effettiva.
Sezione specifica Microsoft
Nel codice Microsoft C++ in Windows longjmp
usa la stessa semantica di rimozione dello stack del codice di gestione delle eccezioni. È possibile usare in modo sicuro nelle stesse posizioni che è possibile generare eccezioni C++. Tuttavia, questo utilizzo non è portabile e include alcune avvertenze importanti.
Chiamare solo prima della funzione che ha chiamato setjmp
restituisce. In caso longjmp
contrario, i risultati sono imprevedibili.
Tenere conto delle restrizioni seguenti quando si usa longjmp
:
Non presupporre che i valori delle variabili di registro rimangano invariati. I valori delle variabili di registro nella routine che chiama
setjmp
potrebbero non essere ripristinati sui valori appropriati dopo l'esecuzione dilongjmp
.Non usare
longjmp
per trasferire il controllo da una routine di gestione degli interrupt, a meno che l'interrupt non sia causato da un'eccezione a virgola mobile. In questo caso, un programma può restituire il controllo da un gestore di interrupt tramitelongjmp
se reinizializza prima di tutto il pacchetto di operazioni matematiche a virgola mobile chiamando_fpreset
.Non usare
longjmp
per trasferire il controllo da una routine di callback richiamata direttamente o indirettamente dal codice di Windows.Se il codice viene compilato usando /EHs o /EHsc e la funzione che contiene la
longjmp
chiamata ènoexcept
, gli oggetti locali in tale funzione potrebbero non essere destruiti durante la rimozione dello stack.
Fine sezione specifica Microsoft
Nota
Nel codice C++ portabile non è possibile presupporre setjmp
e longjmp
supportare la semantica degli oggetti C++. In particolare, una setjmp
/longjmp
coppia di chiamate ha un comportamento indefinito se sostituisce setjmp
e longjmp
da catch
e throw
richiama eventuali distruttori non semplici per qualsiasi oggetto automatico. Nei programmi C++ è consigliabile usare il meccanismo di gestione delle eccezioni C++.
Per altre informazioni, vedere Uso di setjmp e longjmp.
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
longjmp |
<setjmp.h> |
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Esempio
Vedere l'esempio per _fpreset
.