unreachable
From cppreference.net
|
헤더 파일에 정의됨
<stddef.h>
|
||
|
#define unreachable() /* see below */
|
(C23부터) | |
함수형 매크로
unreachable
는
void
표현식으로 확장됩니다.
unreachable
(
)
를 실행하면
정의되지 않은 동작
이 발생합니다.
구현체는 이를 사용하여 불가능한 코드 분기를 제거하거나(일반적으로 최적화 빌드에서) 추가 실행을 방지하기 위해 트랩할 수 있습니다(일반적으로 디버그 빌드에서).
목차 |
가능한 구현
// 가능하다면 컴파일러별 확장 기능을 사용합니다. #ifdef __GNUC__ // GCC, Clang, ICC #define unreachable() (__builtin_unreachable()) #elifdef _MSC_VER // MSVC #define unreachable() (__assume(false)) #else // 확장 기능이 사용되지 않더라도, 빈 함수 본문과 noreturn 속성에 의해 // 정의되지 않은 동작이 여전히 발생합니다. // unreachable_impl의 외부 정의는 C 언어의 인라인 함수 규칙으로 인해 // 별도의 번역 단위에서 생성되어야 합니다. [[noreturn]] inline void unreachable_impl() {} #define unreachable() (unreachable_impl()) #endif |
예제
이 코드 실행
#include <assert.h> #include <stddef.h> #include <stdint.h> #include <stdlib.h> struct Color { uint8_t r, g, b, a; }; struct ColorSpan { struct Color* data; size_t size; }; // 제한된 텍스처 크기 집합만 지원된다고 가정합니다. struct ColorSpan allocate_texture(size_t xy) { switch (xy) { case 128: [[fallthrough]]; case 256: [[fallthrough]]; case 512: { /* ... */ struct ColorSpan result = { .data = malloc(xy * xy * sizeof(struct Color)), .size = xy * xy }; if (!result.data) result.size = 0; return result; } default: unreachable(); } } int main(void) { struct ColorSpan tex = allocate_texture(128); // 정상 assert(tex.size == 128 * 128); struct ColorSpan badtex = allocate_texture(32); // 정의되지 않은 동작 free(badtex.data); free(tex.data); }
가능한 출력:
Segmentation fault
참고 항목
|
C++ 문서
에 대한
unreachable
|
외부 링크
| 1. |
GCC 문서:
__builtin_unreachable
|
| 2. |
Clang 문서:
__builtin_unreachable
|
| 3. |
MSVC 문서:
__assume
|