| |||
| Home > ARM 컴파일러 참조 > C 및 C++ 구현 정보 > C++ 예외 처리 | |||
C++ 예외 처리는 RVCT에서 완전 지원됩니다. 하지만 컴파일러는 C++ 예외 처리를 기본적으로 지원하지
않습니다. --exceptions 옵션을 사용하여 C++ 예외 처리를 활성화해야 합니다(C++ 언어 구성 및 오브젝트 생성 참조).
Rogue Wave Standard C++ Library는 C++ 예외가 활성화된 상태로 제공됩니다.
예외 테이블 생성을 제한적으로 제어할 수 있습니다(실행 시 함수 해제 참조).
기본적으로 --exceptions를 사용하여 컴파일된 함수는 런타임에 해제될
수 있습니다(C++ 언어 구성 및 오브젝트 생성 참조). 함수
해제에는 C++ 자동 변수의 소멸과 스택 프레임에 저장된 레지스터 값의 복원이 포함됩니다. 함수
해제는 수행할 작업을 설명하는 예외 테이블을 생성하여 구현됩니다.
pragma #pragma exceptions_unwind와 #pragma
no_exceptions_unwind를 사용하여 특정 함수에 대한 해제를 활성화 또는 비활성화할
수 있습니다(코드 생성을 제어하는 pragma 참조). --exceptions_unwind 옵션은
이 pragma의 초기값을 설정합니다.
어떤 함수에 대해 함수 해제를 비활성화하면 다음과 같은 효과가 발생합니다.
예외는 런타임에 해당 함수를 통해 발생될 수 없으며 예외 발생에 대해 스택 해제도 발생하지 않습니다. 해당
언어가 C++일 경우 std::terminate가 호출됩니다.
매우 간결한 예외 테이블 표현을 사용하여 이 함수를 설명할 수 있으며, 이 표현은 테이블 최적화를 통해 스마트 링커를 보조합니다.
호출자와 호출 수신자가 올바르게 상호 작용해야 하므로 함수 인라이닝은 제한됩니다.
따라서 #pragma no_exceptions_unwind를 사용하여
추가 소스 장식이 필요 없는 방식으로 해제를 강제로 방지할 수 있습니다.
반대로, C++에서 빈 함수 예외 사양은 보호되는 함수까지 해제를 허용한 다음, ISO C++ 표준에 따라 std::unexpected()를
호출합니다.