Namespaces
Variants

unreachable

From cppreference.net
定义于头文件 <stddef.h>
#define unreachable() /* 见下文 */
(C23 起)

函数式宏 unreachable 展开为一个 void 表达式。执行 unreachable ( ) 会导致 未定义行为

实现可能使用此功能来优化掉不可能执行的代码分支(通常在优化构建中)或捕获它们以防止进一步执行(通常在调试构建中)。

目录

可能的实现

// 尽可能使用编译器特定扩展
#ifdef __GNUC__ // GCC, Clang, ICC
#define unreachable() (__builtin_unreachable())
#elifdef _MSC_VER // MSVC
#define unreachable() (__assume(false))
#else
// 即使未使用任何扩展,空函数体与noreturn属性仍会引发未定义行为
// 由于C语言内联函数规则,unreachable_impl的外部定义必须在单独的翻译单元中生成
[[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