다음을 통해 공유


longjmp

호출에 의해 설정된 스택 환경 및 실행 로캘을 복원합니다 setjmp .

구문

void longjmp(
   jmp_buf env,
   int value
);

매개 변수

env
환경이 저장되는 변수입니다.

value
setjmp 호출에 대해 반환되는 값입니다.

설명

longjmp 함수는 env에 의해 setjmp에서 이전에 저장된 스택 환경 및 실행 로캘을 복원합니다. setjmplongjmp 비로컬goto을 실행하는 방법을 제공합니다. 일반적으로 일반적인 호출 및 반환 규칙을 사용하지 않고 이전에 호출된 루틴에서 실행 제어를 오류 처리 또는 복구 코드 전달하는 데 사용됩니다.

setjmp에 대한 호출은 현재 스택 환경을 env에 저장합니다. longjmp에 대한 후속 호출은 저장된 환경을 복원하고 컨트롤을 해당 setjmp 호출 바로 다음에 오는 포인터로 반환합니다. 호출에서 반환된 것처럼 value 실행이 setjmp 다시 시작됩니다. 컨트롤을 받는 루틴에 액세스할 수 있는 모든 변수 값(레지스터 변수 제외)은 longjmp가 호출될 때 가지고 있던 값을 포함합니다. 레지스터 변수 값은 예측할 수 없습니다. setjmp에서 반환되는 값은 0이 아니어야 합니다. 0으로 전달되는 경우 value 값 1은 실제 반환에서 대체됩니다.

Microsoft 전용

Windows longjmp 의 Microsoft C++ 코드에서 예외 처리 코드와 동일한 스택 해제 의미 체계를 사용합니다. C++ 예외가 발생할 수 있는 동일한 위치에서 사용하는 것이 안전합니다. 그러나 이 사용법은 이식 가능하지 않으며 몇 가지 중요한 주의 사항이 함께 제공됩니다.

호출된 함수 앞에만 호출 longjmp setjmp 이 반환되고, 그렇지 않으면 결과를 예측할 수 없습니다.

longjmp를 사용할 때 다음 제한 사항을 준수하십시오.

  • 레지스터 변수의 값이 동일하게 유지된다고 가정하지 마세요. setjmp를 호출하는 루틴의 레지스터 변수 값은 longjmp가 실행된 이후 적절한 값으로 복원되지 않을 수 있습니다.

  • 중단이 부동 소수점 예외로 인해 발생하지 않는 한 인터럽트 처리 루틴에서 제어를 전송하는 데 사용하지 longjmp 마세요. 이 경우 먼저 longjmp을 호출하여 부동 소수점 연산 패키지를 다시 초기화하는 경우 프로그램은 _fpreset를 통해 인터럽트 처리기에서 반환될 수 있습니다.

  • Windows 코드에서 직접 또는 간접적으로 호출되는 콜백 루틴에서 제어를 전송하는 데 사용하지 longjmp 마세요.

  • /EHs 또는 /EHsc를 사용하여 코드를 컴파일하고 호출을 포함하는 longjmp 함수가 noexcept있는 경우 스택 해제 중에 해당 함수의 로컬 개체가 소멸되지 않을 수 있습니다.

Microsoft 전용 종료

참고 항목

이식 가능한 C++ 코드에서는 C++ 개체 의미 체계를 가정 setjmp 하고 longjmp 지원할 수 없습니다. 특히 setjmp/longjmp 호출 쌍은 자동 개체를 setjmp 대체하고 longjmp 모든 자동 개체에 catch throw 대해 사소한 소멸자를 호출하는 경우 정의되지 않은 동작을 가합니다. C++ 프로그램에서는 C++ 예외 처리 메커니즘을 사용하는 것이 좋습니다.

자세한 내용은 setjmp 및 longjmp 사용을 참조하세요.

요구 사항

루틴에서 반환된 값 필수 헤더
longjmp <setjmp.h>

호환성에 대한 자세한 내용은 호환성을 참조하세요.

예시

_fpreset에 대한 예를 참조하세요.

참고 항목

프로세스 및 환경 제어setjmp