Condividi tramite


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 di longjmp.

  • 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 tramite longjmp 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.

Vedi anche

Processo e controllo dell'ambientesetjmp