setjmp y longjmp en C
Un salto no local a un punto guardado — lo más cercano a una excepción que tiene C.
#include <setjmp.h>
#include <stdio.h>
static jmp_buf recovery;
static void deep(int depth) {
if (depth > 2) {
longjmp(recovery, 42);
}
deep(depth + 1);
}
int attempt(void) {
volatile int attempts = 0;
int code = setjmp(recovery);
if (code != 0) {
printf("recovered with %d after %d attempt(s)\n", code, attempts);
return code;
}
attempts++;
deep(0);
return 0;
}
Cómo funciona
setjmpretorna cero al guardar y distinto de cero al recibir el salto.longjmpdesenrolla sin correr ninguna limpieza.- Las locales que deban sobrevivirlo deberían ser
volatile.
Palabras clave y builtins usados aquí
ifintjmp_bufreturnstaticvoidvolatile
El intento, en números
- Líneas
- 24
- Caracteres a escribir
- 366
- Tokens
- 98
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 53 segundos.
Paso 2 de 2 en Válvulas de escape; paso 12 de 13 en Uniones, campos de bits y comportamiento indefinido.