setjmp.h는 비로컬 점프를 제공하기 위한 C 표준 라이브러리에 정의된 헤더 파일로 일반적인 서브루틴 콜에서 벗어나고 시퀀스를 반환하는 제어 흐름이다. 상호보완적인 함수 setjmplongjmp가 이러한 기능을 제공한다.

setjmp/longjmp의 일반적인 사용법은 여러 단계의 함수 호출에서도 프로그램 또는 스레드 상태를 재설정하는 데 longjmp 기능을 활용하는 예외 매커니즘의 구현에 있다. 그 외의 setjmp 용도로는 코루틴과 비슷한 구문을 만들기 위해 사용된다.

간단한 예 편집

setjmp의 기초적인 예시를 보여준다. 여기서 main()second()를 호출하는 first()를 호출한다. 다음, second()main()로 점프하면서 first()printf()의 호출을 생략한다.

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
    printf("second\n");         // 출력
    longjmp(buf,1);             // setjmp가 호출된 곳으로 점프하면서 setjmp가 1을 반환
}

void first(void) {
    second();
    printf("first\n");          // 출력되지 않음
}

int main() {
    if (!setjmp(buf))
        first();                // 실행되면 setjmp가 0을 반환
    else                        // longjmp 점프가 되돌아가면 setjmp가 1을 반환
        printf("main\n");       // 출력

    return 0;
}

실행하면 다음과 같이 출력한다.

second
main

first() 서브루틴이 호출되어도 "first"이 출력되지 않는 것을 확인할 수 있다. 조건문 if (!setjmp(buf))이 두 번 실행함으로서 "main"에서 출력 코드가 실행된다.