Compartilhar via


longjmp

Restaura o ambiente de pilha e a localidade de execução definida por uma chamada setjmp.

Sintaxe

void longjmp(
   jmp_buf env,
   int value
);

Parâmetros

env
Variável em que o ambiente é armazenado.

value
Valor a ser retornado para setjmp chamar.

Comentários

A função longjmp restaura um ambiente de pilha e a localidade de execução salvos anteriormente em env por setjmp. setjmp e longjmp fornecer uma maneira de executar um código não local goto; eles são normalmente usados para passar o controle de execução para o código de tratamento de erros ou recuperação em uma rotina chamada anteriormente sem usar as convenções normais de chamada e retorno.

Uma chamada para setjmp faz com que o ambiente de pilha atual seja salvo em env. Uma chamada subsequente para longjmp restaura o ambiente salvo e retorna o controle para o ponto imediatamente após a chamada do setjmp correspondente. A execução é retomada como se value tivesse sido retornada setjmp pela chamada. Os valores de todas as variáveis (exceto a variáveis de registro) acessíveis para a rotina de recebimento do controle contêm os valores que tinham quando longjmp foi chamado. Os valores das variáveis de registro são imprevisíveis. O valor retornado por setjmp deve ser diferente de zero. Se value for passado como 0, o valor 1 é substituído no retorno real.

Seção específica da Microsoft

No código do Microsoft C++ no Windows, longjmp usa a mesma semântica de desenrolamento de pilha que o código de tratamento de exceções. É seguro usar nos mesmos locais em que as exceções do C++ podem ser geradas. No entanto, esse uso não é portátil e tem algumas ressalvas importantes.

Chame longjmp apenas antes que a função chamada setjmp retorne; caso contrário, os resultados são imprevisíveis.

Observe as seguintes restrições ao usar longjmp:

  • Não presuma que os valores das variáveis de registro permanecerão os mesmos. Os valores das variáveis de registro da chamada de rotina setjmp não podem ser restaurados para os valores adequados após a execução de longjmp.

  • Não use longjmp para transferir o controle para fora de uma rotina de tratamento de interrupção, a menos que a interrupção seja causada por uma exceção de ponto flutuante. Nesse caso, um programa poderá retornar de um manipulador de interrupção via longjmp, se ele reinicializar primeiro o pacote de matemática de ponto flutuante chamando _fpreset.

  • Não use longjmp para transferir o controle de uma rotina de retorno de chamada invocada direta ou indiretamente pelo código Windows.

  • Se o código for compilado usando /EHs ou /EHsc e a função que contém a longjmp chamada for noexcept, os objetos locais nessa função não poderão ser destruídos durante o desenrolamento da pilha.

Fim da seção específica da Microsoft

Observação

No código C++ portátil, você não pode presumir que setjmp e longjmp dão suporte à semântica de objeto C++. Especificamente, um par de chamadas setjmp/longjmp terá um comportamento indefinido ao substituir setjmp e longjmp por catch, e throw invocará os destruidores não triviais para os objetos automáticos, se houver. Em programas C++, é recomendável usar o mecanismo de manipulação de exceções do C++.

Para obter mais informações, consulte Usando o setjmp e o longjmp.

Requisitos

Rotina Cabeçalho necessário
longjmp <setjmp.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

Confira o exemplo de _fpreset.

Confira também

Controle de processo e ambientesetjmp