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 delongjmp
.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 vialongjmp
, 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 fornoexcept
, 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
.