longjmp
|
헤더 파일에 정의됨
<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 이후) | |
이전에 호출된
setjmp
가 저장한 실행 컨텍스트
env
를 로드합니다. 이 함수는 반환하지 않습니다. 제어는
env
를 설정한
setjmp
매크로의 호출 지점으로 전달됩니다. 해당
setjmp
는
status
로 전달된 값을 반환합니다.
setjmp
를 호출한 함수가 반환되거나 스택 상위에서 다른
longjmp
에 의해 종료된 경우(어떤 방식으로든), 그 동작은 정의되지 않습니다. 즉, 호출 스택을 거슬러 올라가는 롱 점프만 허용됩니다.
|
다른 스레드를 가로지르는 점프(만약
|
(since C11) |
|
setjmp
가 호출되었을 때
VLA
또는 다른
가변 수정 타입
변수가 스코프 내에 있었고 제어가 해당 스코프를 벗어난 경우,
스택을 거슬러 올라가는 과정에서
void g(int n) { int a[n]; // a가 계속 할당된 상태로 남을 수 있음 h(n); // 반환하지 않음 } void h(int n) { int b[n]; // b가 계속 할당된 상태로 남을 수 있음 longjmp(buf, 2); // h의 b와 g의 a에 대해 메모리 누수를 유발할 수 있음 } |
(C99부터) |
목차 |
매개변수
| env | - | setjmp 에 의해 저장된 프로그램 실행 상태를 참조하는 변수 |
| status | - | setjmp 에서 반환할 값. 0 과 같으면 1 이 대신 사용됨 |
반환값
(없음)
참고 사항
longjmp
는 함수가 의미 있는 값을 반환할 수 없는 예상치 못한 오류 조건을 처리하기 위한 것입니다. 이는 다른 프로그래밍 언어의 예외 처리와 유사합니다.
예제
#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); }
출력:
foo(1) called foo(2) called foo(3) called foo(4) called
참고문헌
- 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++ documentation
for
longjmp
|
|