Namespaces
Variants

setjmp

From cppreference.net
헤더 파일에 정의됨 <setjmp.h>
#define setjmp(env) /* implementation-defined */

현재 실행 컨텍스트를 jmp_buf 타입의 env 변수에 저장합니다. 이 변수는 나중에 longjmp 함수를 통해 현재 실행 컨텍스트를 복원하는 데 사용될 수 있습니다. 즉, longjmp 함수 호출이 발생하면, 실행은 longjmp 에 전달된 jmp_buf 변수를 생성한 특정 호출 지점에서 계속됩니다. 이 경우 setjmp longjmp 에 전달된 값을 반환합니다.

setjmp 의 호출은 다음 문맥 중 하나에서만 나타나야 합니다:

  1. if , switch , while , do-while , for 문의 전체 제어식.
    switch(setjmp(env)) { // ...
  2. 관계 연산자나 동등 연산자의 한 피연산자가 정수 상수 표현식이고, 결과 표현식이 다음의 전체 제어식인 경우: if , switch , while , do-while , for .
    if(setjmp(env) > 10) { // ...
  3. 단항 ! 연산자의 피연산자이며, 결과 표현식이 다음의 전체 제어식인 경우: if , switch , while , do-while , for .
    while(!setjmp(env)) { // ...
  4. 표현식 문 의 전체 표현식 ( void 로 캐스팅될 수 있음).
    setjmp(env);

만약 setjmp 가 다른 어떤 상황에서 나타나더라도, 그 동작은 정의되지 않습니다.

setjmp 의 범위로 복귀할 때:

  • 접근 가능한 모든 객체, 부동소수점 상태 플래그 및 추상 머신의 다른 구성 요소들은 longjmp 가 실행되었을 때와 동일한 값을 가집니다,
  • 단, setjmp 호출을 포함하는 함수 내의 non- volatile 지역 변수들은 제외됩니다. 이러한 변수들은 setjmp 호출 이후 변경되었다면 그 값이 indeterminate 상태입니다.

목차

매개변수

env - 프로그램 실행 상태를 저장할 변수.

반환값

0 매크로가 원본 코드에 의해 호출되고 실행 컨텍스트가 env 에 저장된 경우.

비-로컬 점프가 방금 수행된 경우 0이 아닌 값입니다. 반환 값은 longjmp 에 전달된 값과 동일합니다.

참고 사항

위 요구사항은 setjmp 의 반환 값을 데이터 흐름(예: 객체 초기화 또는 할당에 사용)에서 사용하는 것을 금지합니다. 반환 값은 제어 흐름에서만 사용되거나 폐기되어야 합니다.

예제

#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.1.1 setjmp 매크로 (p: 191)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.13.1.1 setjmp 매크로 (p: 262-263)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.13.1.1 setjmp 매크로 (p: 243-244)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.6.1 setjmp 매크로

참고 항목

지정된 위치로 점프
(함수)