Namespaces
Variants

setjmp

From cppreference.net
Utilities library
헤더 파일에 정의됨 <csetjmp>
#define setjmp(env) /* implementation-defined */

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

setjmp 의 호출은 다음 문맥 중 하나에서만 나타나야 합니다:

  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. 표현식 문 의 전체 표현식 ( void 로 캐스팅될 수 있음).
    setjmp(env);

만약 setjmp 가 다른 어떤 상황에서 나타나더라도, 그 동작은 정의되지 않습니다.

추가적으로, 코루틴 내에서 setjmp co_await 연산자가 사용될 수 있는 위치에서 호출되는 경우의 동작은 정의되지 않습니다.

(C++20부터)

setjmp 의 범위로 복귀할 때:

  • 접근 가능한 모든 객체, 부동소수점 상태 플래그 및 추상 머신의 다른 구성 요소들은 std::longjmp 가 실행되었을 때와 동일한 값을 가집니다,
  • setjmp 호출을 포함하는 함수 내의 non- volatile 지역 변수들은 제외됩니다. 이 변수들은 setjmp 호출 이후 변경되었다면 그 값들이 indeterminate 상태입니다.

목차

매개변수

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

참고 항목

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