Namespaces
Variants

setjmp

From cppreference.net
Definido en el encabezado <setjmp.h>
#define setjmp(env) /* implementation-defined */

Guarda el contexto de ejecución actual en una variable env de tipo jmp_buf . Esta variable puede usarse posteriormente para restaurar el contexto de ejecución actual mediante la función longjmp . Es decir, cuando se realiza una llamada a la función longjmp , la ejecución continúa en el sitio de llamada particular que construyó la variable jmp_buf pasada a longjmp . En ese caso setjmp devuelve el valor pasado a longjmp .

La invocación de setjmp debe aparecer únicamente en uno de los siguientes contextos:

  1. La expresión de control completa de if , switch , while , do-while , for .
    switch(setjmp(env)) { // ...
  2. Un operando de un operador relacional o de igualdad con el otro operando siendo una expresión constante entera, siendo la expresión resultante la expresión de control completa de if , switch , while , do-while , for .
    if(setjmp(env) > 10) { // ...
  3. El operando de un operador unario ! siendo la expresión resultante la expresión de control completa de if , switch , while , do-while , for .
    while(!setjmp(env)) { // ...
  4. La expresión completa de una sentencia de expresión (posiblemente convertida a void ).
    setjmp(env);

Si setjmp aparece en cualquier otro contexto, el comportamiento es indefinido.

Al regresar al ámbito de setjmp :

  • todos los objetos accesibles, las banderas de estado de punto flotante y otros componentes de la máquina abstracta tienen los mismos valores que tenían cuando longjmp fue ejecutado,
  • excepto por las variables locales no- volatile en la función que contiene la invocación de setjmp , cuyos valores son indeterminados si han sido modificados desde la invocación de setjmp .

Contenidos

Parámetros

env - variable para guardar el estado de ejecución del programa.

Valor de retorno

0 si la macro fue llamada por el código original y el contexto de ejecución fue guardado en env .

Valor distinto de cero si se acaba de realizar un salto no local. El valor de retorno es el mismo que se pasó a longjmp .

Notas

Los requisitos anteriores prohíben utilizar el valor de retorno de setjmp en flujo de datos (por ejemplo, para inicializar o asignar un objeto con él). El valor de retorno solo puede usarse en flujo de control o descartarse.

Ejemplo

#include <stdio.h>
#include <setjmp.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 C17 (ISO/IEC 9899:2018):
  • 7.13.1.1 La macro setjmp (p: 191)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.13.1.1 The setjmp macro (p: 262-263)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.13.1.1 The setjmp macro (p: 243-244)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.6.1 La macro setjmp

Véase también

salta a la ubicación especificada
(función)