Namespaces
Variants

std::longjmp

ko.cppreference.net 에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
Swap 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
헤더 <csetjmp>
             void longjmp( std::jmp_buf env, int status );
에 정의됨 (C++17까지)
[[noreturn]] void longjmp( std::jmp_buf env, int status );
(C++17부터)

이전 envsetjmp 호출로 저장된 실행 컨텍스트 를 로드합니다. 이 함수는 반환되지 않습니다. 제어는 를 설정한 매크로 setjmpenv의 호출 지점으로 전송됩니다. 해당 setjmp는 status으로 전달된 값을 반환합니다.

setjmp를 호출한 함수가 종료된 경우, 동작은 정의되지 않습니다 (즉, 호출 스택 위로의 긴 점프만 허용됩니다).

C++의 추가 제한 사항

C의 longjmp 위에 구축된 C++ std::longjmp 는 더 제한된 동작을 가집니다.

만약 std::longjmp 를 throw 로 대체하고 setjmp 를 catch 로 대체했을 때 자동 객체에 대한 non-trivial destructor 가 호출된다면, 이러한 std::longjmp 의 동작은 정의되지 않습니다.

std::longjmp 가 코루틴 내에서 co_await 연산자가 사용될 수 있는 위치에서 호출되면 동작은 정의되지 않습니다.

(C++20부터)

매개변수

env - 프로그램의 실행 상태를 참조하는 변수로, setjmp 에 의해 저장됨
status - setjmp 에서 반환할 값. ​ 0 ​ 과 같으면 1 이 대신 사용됨

참고 사항

std::longjmp 는 함수가 의미 있는 값을 반환할 수 없는 예상치 못한 오류 상황을 처리하기 위해 C에서 사용되는 메커니즘입니다. C++는 일반적으로 이러한 목적으로 예외 처리 를 사용합니다.

예제

#include <array>
#include <cmath>
#include <csetjmp>
#include <cstdlib>
#include <format>
#include <iostream>
std::jmp_buf solver_error_handler;
std::array<double, 2> solve_quadratic_equation(double a, double b, double c)
{
    const double discriminant = b * b - 4.0 * a * c;
    if (discriminant < 0)
        std::longjmp(solver_error_handler, true); // 오류 핸들러로 이동
    const double delta = std::sqrt(discriminant) / (2.0 * a);
    const double argmin = -b / (2.0 * a);
    return {argmin - delta, argmin + delta};
}
void show_quadratic_equation_solution(double a, double b, double c)
{
    std::cout << std::format("{}x² + {}x + {} = 0 방정식 풀이 중...\n", a, b, c);
    auto [x_0, x_1] = solve_quadratic_equation(a, b, c);
    std::cout << std::format("x₁ = {}, x₂ = {}\n\n", x_0, x_1);
}
int main()
{
    if (setjmp(solver_error_handler))
    {
        // 솔버 오류 핸들러
        std::cout << "실수 해 없음\n";
        return EXIT_FAILURE;
    }
    for (auto [a, b, c] : {std::array{1, -3, 2}, {2, -3, -2}, {1, 2, 3}})
        show_quadratic_equation_solution(a, b, c);
    return EXIT_SUCCESS;
}

출력:

1x² + -3x + 2 = 0 방정식 풀이 중...
x₁ = 1, x₂ = 2
2x² + -3x + -2 = 0 방정식 풀이 중...
x₁ = -0.5, x₂ = 2
1x² + 2x + 3 = 0 방정식 풀이 중...
실수 해 없음

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 619 C++98 C++의 추가 제한 사항에 대한 문구가 모호함 문구를 개선함
LWG 894 C++98 std::longjmp 를 throw 로 대체하고 setjmp 를
catch 로 대체할 때 자동 객체가 파괴되면
동작이 정의되지 않음
자동 객체의 비트리비얼 소멸자가
호출되는 경우에만 동작이 정의되지 않음

참고 항목

컨텍스트 저장
(함수 매크로)
C 문서 for longjmp