Namespaces
Variants

setjmp

cppreference.com에서
 
 
유틸리티 라이브러리
언어 지원
타입 지원 (기본 타입, RTTI)
라이브러리 기능-테스트 매크로 (C++20)
프로그램 유틸리티
가변 인수 함수
코루틴 지원 (C++20)
계약 지원 (C++26)
삼방향 비교
(C++20)
(C++20) (C++20) (C++20)    
(C++20) (C++20) (C++20)

일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
 
 
헤더 <csetjmp>
#define setjmp(env) /* implementation-defined */

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

setjmpsetjmp의 호출은 다음 컨텍스트 중 하나에서만 나타나야 합니다:

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

setjmpsetjmp가 다른 컨텍스트에 나타나면 동작이 정의되지 않습니다.

또한, setjmpsetjmp가 코루틴 내에서 co_awaitco_await 연산자가 사용될 수 있는 위치에서 호출되면 동작이 정의되지 않습니다.

(C++20부터)

setjmpsetjmp의 범위로 돌아올 때:

  • 모든 접근 가능한 객체, 부동소수점 상태 플래그 및 추상 기계의 기타 구성 요소는 std::longjmp가 실행되었을 때와 동일한 값을 갖습니다.
  • 단, setjmp 호출을 포함하는 함수 내의 volatilesetjmp이 아닌 지역 변수는 setjmpsetjmp 호출 이후 변경된 경우 그 값이 불확정적입니다.

매개변수

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

반환값

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

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

참고 사항

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

예제

#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 풀이 중...
실수 해 없음

참고 항목

지정된 위치로 이동
(함수)