Uso di setjmp e longjmp

Quando setjmp e longjmp vengono usati insieme, forniscono un modo per eseguire un oggetto non localegoto. Vengono in genere usati nel codice C per passare il controllo di esecuzione al codice di gestione degli errori o di ripristino in una routine chiamata in precedenza senza usare le convenzioni standard di chiamata o restituzione.

Attenzione

Poiché setjmp e longjmp non supportano la corretta distruzione degli oggetti stack frame tra i compilatori C++ e perché potrebbero compromettere le prestazioni impedendo l'ottimizzazione sulle variabili locali, non è consigliabile usarli nei programmi C++. È consigliabile usare try e catch costrutti.

Se si decide di usare setjmp e longjmp in un programma C++, includere <anche setjmp.h> o <setjmpex.h> per garantire un'interazione corretta tra le funzioni e la gestione delle eccezioni strutturate (edizione Standard H) o C++.

Sezione specifica Microsoft

Se si usa un'opzione /EH per compilare il codice C++, i distruttori per gli oggetti locali vengono chiamati durante la rimozione dello stack. Tuttavia, se si usa /EHs o /EHsc per la compilazione e una delle funzioni che usa noexcept chiama longjmp, la rimozione del distruttore per tale funzione potrebbe non verificarsi, a seconda dello stato dell'utilità di ottimizzazione.

Nel codice portabile, quando viene eseguita una longjmp chiamata, la corretta distruzione degli oggetti basati su frame non è garantita in modo esplicito dallo standard e potrebbe non essere supportata da altri compilatori. Per informare l'utente, al livello di avviso 4, una chiamata a setjmp causa dell'avviso C4611: l'interazione tra "_setjmp" e la distruzione degli oggetti C++ non è portabile.

Fine sezione specifica Microsoft

Vedi anche

Combinazione di eccezioni C (strutturate) e C++