Namespaces
Variants

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