std:: longjmp
|
헤더 파일에 정의됨
<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
의 동작은 정의되지 않습니다.
|
|
(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
|
|