typestar

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

  1. setjmp retorna cero al guardar y distinto de cero al recibir el salto.
  2. longjmp desenrolla sin correr ninguna limpieza.
  3. Las locales que deban sobrevivirlo deberían ser volatile.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 2 en Válvulas de escape; paso 12 de 13 en Uniones, campos de bits y comportamiento indefinido.

← Anterior Siguiente →