std:: unreachable
From cppreference.net
C++
Utilities library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Program support utilities
| Program termination | |||||||||||||||||||||
|
|||||||||||||||||||||
| Unreachable control flow | |||||||||||||||||||||
|
unreachable
(C++23)
|
|||||||||||||||||||||
| Communicating with the environment | |||||||||||||||||||||
| Signals | |||||||||||||||||||||
| Signal types | |||||||||||||||||||||
| Non-local jumps | |||||||||||||||||||||
| Types | |||||||||||||||||||||
|
헤더 파일에 정의됨
<utility>
|
||
|
[
[
noreturn
]
]
void
unreachable
(
)
;
|
(C++23부터) | |
주어진 지점에서 undefined behavior 를 발생시킵니다.
구현체는 이를 사용하여 불가능한 코드 분기를 제거하거나(일반적으로 최적화 빌드에서) 추가 실행을 방지하기 위해 트랩할 수 있습니다(일반적으로 디버그 빌드에서).
목차 |
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_unreachable
|
202202L
|
(C++23) |
std::unreachable
|
가능한 구현
[[noreturn]] inline void unreachable() { // 가능한 경우 컴파일러별 확장 기능을 사용합니다. // 확장 기능이 사용되지 않더라도, 빈 함수 본문과 noreturn 속성에 의해 // 정의되지 않은 동작이 여전히 발생합니다. #if defined(_MSC_VER) && !defined(__clang__) // MSVC __assume(false); #else // GCC, Clang __builtin_unreachable(); #endif } |
예제
이 코드 실행
#include <cassert> #include <cstddef> #include <cstdint> #include <utility> #include <vector> struct Color { std::uint8_t r, g, b, a; }; // 제한된 텍스처 크기 집합만 지원된다고 가정합니다. void generate_texture(std::vector<Color>& tex, std::size_t xy) { switch (xy) { case 128: [[fallthrough]]; case 256: [[fallthrough]]; case 512: /* ... */ tex.clear(); tex.resize(xy * xy, Color{0, 0, 0, 0}); break; default: std::unreachable(); } } int main() { std::vector<Color> tex; generate_texture(tex, 128); // 정상 assert(tex.size() == 128 * 128); generate_texture(tex, 32); // 정의되지 않은 동작 발생 }
가능한 출력:
Segmentation fault
참고 항목
[[
assume
(
expression
)]]
(C++23)
|
주어진 지점에서
expression
이 항상
true
로 평가됨을 지정함
(속성 지정자) |
|
(C++20)
|
포인터가 정렬되었음을 컴파일러에 알림
(함수 템플릿) |
|
C 문서
for
unreachable
|
|
외부 링크
| 1. |
GCC 문서:
__builtin_unreachable
|
| 2. |
Clang 문서:
__builtin_unreachable
|
| 3. |
MSVC 문서:
__assume
|