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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per