longjmp
호출에 의해 설정된 스택 환경 및 실행 로캘을 복원합니다 setjmp
.
구문
void longjmp(
jmp_buf env,
int value
);
매개 변수
env
환경이 저장되는 변수입니다.
value
setjmp
호출에 대해 반환되는 값입니다.
설명
longjmp
함수는 env
에 의해 setjmp
에서 이전에 저장된 스택 환경 및 실행 로캘을 복원합니다. setjmp
및 longjmp
비로컬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
에 대한 예를 참조하세요.