<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().

Recebe: Uma variável (do tipo jmp_buf) que irá indicar o ponto a partir do qual o código é executado quando a função longjmp() for chamada.

Retorna: Retorna 0 na primeira vez em que é chamada. Se o retorno ocorrer após um salto através da função longjmp(), ela retorna o valor passado como segundo argumento para 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.

Recebe: Uma variável do tipo jmp_buf, que indica para onde a função deverá saltar, e um valor numérico diferente de zero, o qual será utilizado pela função setjmp() para retornar esse valor após a execução do salto.

Retorna: Esta função nunca retorna ao seu ponto de chamada, pois ela desvia o fluxo do programa diretamente para o ponto definido pelo setjmp().

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!!