Namespaces
Variants

longjmp

De es.cppreference.net
Definido en el encabezado <setjmp.h>
void longjmp( jmp_buf env, int status );
(hasta C11)
_Noreturn void longjmp( jmp_buf env, int status );
(desde C11)
(hasta C23)
[[noreturn]] void longjmp( jmp_buf env, int status );
(desde C23)

Carga el contexto de ejecución env guardado por una llamada previa a setjmp. Esta función no retorna. El control se transfiere al sitio de llamada de la macro setjmp que configuró env. Ese setjmp entonces devuelve el valor, pasado como status.

Si la función que llamó a setjmp ha terminado (ya sea por return o por otro longjmp más arriba en la pila), el comportamiento es indefinido. En otras palabras, solo se permiten saltos largos hacia arriba en la pila de llamadas.

El salto entre hilos (si la función que llamó a setjmp fue ejecutada por otro hilo) también es comportamiento indefinido.

(desde C11)

Si cuando setjmp fue llamado, una variable de tipo VLA u otro tipo modificable variablemente estaba en alcance y el control abandonó ese alcance, longjmp a ese setjmp invoca comportamiento indefinido incluso si el control permaneció dentro de la función.

En el camino hacia arriba en la pila, longjmp no desasigna ningún VLA, pueden ocurrir fugas de memoria si sus vidas terminan de esta manera:

void g(int n)
{
    int a[n]; // a may remain allocated
    h(n); // does not return
}
void h(int n)
{
    int b[n]; // b may remain allocated
    longjmp(buf, 2); // might cause a memory leak for h's b and g's a
}
(desde C99)

Parámetros

env - variable que se refiere al estado de ejecución del programa guardado por setjmp
status - el valor que debe devolver setjmp. Si es igual a 0, se usa 1 en su lugar

Notas

longjmp está destinado para manejar condiciones de error inesperadas donde la función no puede retornar de manera significativa. Esto es similar al manejo de excepciones en otros lenguajes de programación.

Ejemplo

#include <setjmp.h>
#include <stdio.h>
#include <stdnoreturn.h>

jmp_buf my_jump_buffer;

noreturn void foo(int status)
{
    printf("foo(%d) called\n", status);
    longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}

int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
        foo(++count);
}

Salida:

foo(1) called
foo(2) called
foo(3) called
foo(4) called

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.13.2.1 La macro longjmp (p: 283-284)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.13.2.1 La macro longjmp (p: 191-192)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.13.2.1 La macro longjmp (p: 263-264)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.13.2.1 La macro longjmp (p: 244-245)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.6.2.1 La función longjmp

Véase también

guarda el contexto
(macro de función)