Namespaces
Variants

std:: longjmp

From cppreference.net
Utilities library
헤더 파일에 정의됨 <csetjmp>
void longjmp ( std:: jmp_buf env, int status ) ;
(C++17 이전)
[ [ noreturn ] ] void longjmp ( std:: jmp_buf env, int status ) ;
(C++17 이후)

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

setjmp 를 호출한 함수가 이미 종료된 경우, 동작은 정의되지 않습니다 (즉, 호출 스택을 거슬러 올라가는 long jump만 허용됩니다).

목차

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