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
|