Namespaces
Variants

longjmp

cppreference.net에서
헤더에 정의됨<setjmp.h>
void longjmp( jmp_buf env, int status );
(C11까지)
_Noreturn void longjmp( jmp_buf env, int status );
(C11부터)
(C23까지)
[[noreturn]] void longjmp( jmp_buf env, int status );
(C23부터)

실행 컨텍스트env를 이전의 setjmp 호출에 의해 저장된 것을 로딩합니다. 이 함수는 반환하지 않습니다. 제어는 setjmp 매크로의 호출 지점으로 전송되며, 이 매크로가 env를 설정했습니다. 그 setjmp는 status로 전달된 값을 반환합니다.

만약 setjmp를 호출한 함수가 종료되었다면 (반환이나 스택 위의 다른 longjmp에 의해), 동작은 정의되지 않습니다. 즉, 호출 스택 위로의 긴 점프만 허용됩니다.

스레드 간 점프 (setjmp를 호출한 함수가 다른 스레드에 의해 실행된 경우) 또한 정의되지 않은 동작입니다.

(C11부터)

만약 setjmp가 호출되었을 때, VLA 또는 다른 가변 수정 타입 변수가 범위 내에 있었고 제어가 그 범위를 벗어났다면, 그 longjmp으로의 setjmp는 함수 내에 제어가 남아있더라도 정의되지 않은 동작을 호출합니다.

스택 위로 올라가는 도중, longjmp는 VLA를 할당 해제하지 않습니다. 이러한 방식으로 수명이 종료되면 메모리 누수가 발생할 수 있습니다.

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
}
(C99부터)

매개변수

env - setjmp
에 의해 저장된 프로그램 실행 상태를 참조하는 변수 status - setjmp에서 반환할 값. 0와 같으면 1이 대신 사용됩니다.

참고

longjmp는 함수가 의미 있게 반환할 수 없는 예상치 못한 오류 조건을 처리하기 위한 것입니다. 이는 다른 프로그래밍 언어의 예외 처리와 유사합니다.

예제

#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);
}

출력:

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

참조

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.13.2.1 longjmp 매크로 (p: 283-284)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.13.2.1 longjmp 매크로 (p: 191-192)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.13.2.1 longjmp 매크로 (p: 263-264)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.13.2.1 longjmp 매크로 (p: 244-245)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.6.2.1 longjmp 함수

같이 보기

컨텍스트를 저장함
(함수 매크로)
C++ 문서에 대한 longjmp