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. setjmpe fornecem uma maneira de executar um código não-localgoto, normalmente são usados para passar o controle de execução para o tratamento de erros ou código de recuperação em uma rotina anteriormente chamada sem usar as convenções normais de chamada e longjmp 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 será 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 lugares em que as exceções do C++ podem ser geradas. No entanto, esse uso não é portátil e tem algumas ressalvas importantes.

Só chame longjmp antes que a função que chamou setjmp retorne, caso contrário os resultados são imprevisíveis.

Observe as seguintes restrições ao usar longjmp:

  • Não assuma 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 de uma rotina de manipulação de interrupções, 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 do 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 desenrolar 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 processos e ambientessetjmp