표준 라이브러리 헤더 <setjmp.h>
표준 라이브러리 헤더 <setjmp.h>
중첩된 함수 호출을 한 번에 뛰쳐나와야 할 때, 예를 들어 깊은 오류 상황에서 아주 먼 곳의 오류 처리 지점으로 바로 돌아가고 싶을 때가 있어요. goto는 같은 함수 안에서만 쓸 수 있어서 이럴 때 한계가 있죠. <setjmp.h>는 프로그램 지원 유틸리티 라이브러리의 일부로, **비지역 점프(non-local jump)**를 가능하게 해 주는 setjmp/longjmp를 제공해요.
출처: cppreference
본문
타입(Types)
| 타입 | 설명 |
|---|---|
jmp_buf |
실행 컨텍스트 타입. setjmp가 저장하고 longjmp가 복원하는 상태 |
매크로(Macros)
| 매크로 | 설명 |
|---|---|
setjmp |
현재 컨텍스트를 저장하는 함수 매크로 |
함수(Functions)
| 함수 | 설명 |
|---|---|
longjmp |
지정한 위치로 점프 |
시그니처(Synopsis)
#define __STDC_VERSION_SETJMP_H__ 202311L
typedef /* unspecified */ jmp_buf;
int setjmp(jmp_buf env);
[[noreturn]] void longjmp(jmp_buf env, int val);
동작 방식을 보면, setjmp(env)를 먼저 호출해 현재 실행 위치를 env에 저장해요. 그러면 setjmp는 0을 돌려주죠. 나중에 longjmp(env, val)을 호출하면 실행이 그 저장했던 지점으로 되돌아가는데, 이때 setjmp가 마치 val을 돌려준 것처럼 동작해요. 그래서 setjmp의 반환값을 0과 그 외로 나눠 "정상 경로"와 "오류 경로"를 구분하는 패턴을 써요. val이 0이면 실제로는 1로 취급돼요.
주의할 점은, longjmp 이후 setjmp가 호출된 함수가 이미 반환했거나 volatile로 선언하지 않은 지역 변수 값이 바뀌는 경우 그 값은 규격에 따라 정의되지 않은 상태가 될 수 있다는 거예요.
더 알아보기
- 프로그램 지원 유틸리티 라이브러리 전반은
<stdlib.h>와 함께 확인해요. - 문법적으로는
goto와 비교해 보면 비지역 점프의 차이가 더 선명해져요.