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. // Внешнее определение unreachable_impl должно быть размещено в отдельной единице трансляции // из-за правил для inline-функций в 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); // OK 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
|