Compartilhar via


Usando setjmp e longjmp

Quando setjmp e longjmp são usados juntos, eles fornecem uma maneira de executar um goto não local. Normalmente, eles são usados em código C para transmitir o controle de execução para o código de recuperação ou de tratamento de erros em uma rotina anteriormente chamada anteriormente sem usar as convenções padrão de chamada ou de retorno.

Cuidado

Como setjmp e longjmp não dão suporte à destruição correta de objetos de quadro de pilha portavelmente entre compiladores C++ e porque eles podem degradar o desempenho impedindo a otimização em variáveis locais, não recomendamos seu uso em programas C++. Recomendamos que você use construções try e catch em vez disso.

Se você decidir usar setjmp e longjmp em um programa C++, inclua também <setjmp.h> ou <setjmpex.h> para garantir a interação entre as funções e o tratamento de exceções estruturado (SEH) ou o tratamento de exceções C++.

Seção específica da Microsoft

Se você usar uma opção /EH para compilar código C++, os destruidores de objetos locais serão chamados durante o desenrolamento da pilha. No entanto, se você usar /EHs ou /EHsc para compilar e uma de suas funções que usa noexcept chamar longjmp, o destruidor para essa função poderá não ocorrer, dependendo do estado do otimizador.

No código portátil, quando uma chamada longjmp é executada, a destruição correta de objetos baseados em quadro não é explicitamente garantida pelo padrão e pode não ter suporte de outros compiladores. Para informar você, no nível de aviso 4, uma chamada para setjmp causa o aviso C4611: não é possível portar a interação entre '_setjmp' e destruição de objeto C++.

Fim da seção específica da Microsoft

Confira também

Combinação de exceções C (estruturadas) e C++