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에 의해), 동작은 정의되지 않습니다. 즉, 호출 스택 위로의 긴 점프만 허용됩니다.
|
스레드 간 점프 ( |
(C11부터) |
|
만약 setjmp가 호출되었을 때, 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
| |