<setjmp.h>
No cabeçalho <setjmp.h> estão presentes funções e tipos que são capazes de manipular o fluxo de controle do programa, através de saltos que não seguem a ordem comum de execução.
Diferente da instrução goto, que realiza saltos apenas dentro de uma mesma função, as funções desta
biblioteca permitem realizar saltos entre funções diferentes (saltos não locais), sendo muito úteis para o
tratamento de erros e exceções complexas.
Variáveis e Tipos
jmp_buf
É um tipo de array capaz de armazenar as informações do ambiente de execução (como o estado dos registos e o ponteiro de pilha) para que o programa possa retornar a este ponto exato posteriormente através de um salto.
Funções
int setjmp(jmp_buf ponto)
Salva o ambiente atual (estado do processador) no argumento ponto. Este
ambiente pode ser restaurado posteriormente pela função longjmp().
Exemplo
#include <stdio.h>
#include <setjmp.h>
static jmp_buf ambiente;
void segunda() {
printf("Entrou na função segunda()\n");
longjmp(ambiente, 1); // Salta de volta para onde setjmp foi chamado
}
void primeira() {
segunda();
printf("Esta linha nunca será impressa\n");
}
int main() {
if (!setjmp(ambiente)) {
primeira();
} else {
printf("Retornou à main após o salto da segunda()\n");
}
return 0;
}
Saída esperada
>./main
Entrou na função segunda()
Retornou à main após o salto da segunda()
void longjmp(jmp_buf ponto, int valor)
Restaura o ambiente salvo pela invocação mais recente de setjmp() no mesmo
programa, usando os dados armazenados em ponto.
Exemplo Prático (Loop de Saltos)
#include <stdio.h>
#include <setjmp.h>
int main() {
jmp_buf pulo;
int controle = setjmp(pulo);
if (controle == 1) {
printf("Eu pulo... ");
controle = setjmp(pulo);
}
if (controle == 2) {
printf("e pulo... ");
controle = setjmp(pulo);
}
if (controle == 3) {
printf("e pulo sem parar!!\n");
controle = setjmp(pulo);
}
if (controle != 4)
longjmp(pulo, controle + 1);
return 0;
}
Saída esperada
>./main
Eu pulo... e pulo... e pulo sem parar!!