표준 라이브러리 헤더 <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와 비교해 보면 비지역 점프의 차이가 더 선명해져요.