Недостижимый
Определено в заголовке <stddef.h> | ||
|---|---|---|
#define unreachable() /* see below */ | (с C23) |
Макрос-функция unreachable расширяется до void выражения. Выполнение unreachable() приводит к неопределённому поведению.
Реализация может использовать это для оптимизации исключения невозможных ветвей кода (обычно в оптимизированных сборках) или для перехвата их, чтобы предотвратить дальнейшее выполнение (обычно в отладочных сборках).
Возможная реализация
// Uses compiler specific extensions if possible.
#ifdef __GNUC__ // GCC, Clang, ICC
#define unreachable() (__builtin_unreachable())
#elifdef _MSC_VER // MSVC
#define unreachable() (__assume(false))
#else
// Even if no extension is used, undefined behavior is still raised by
// the empty function body and the noreturn attribute.
// The external definition of unreachable_impl must be emitted in a separated TU
// due to the rule for inline functions in 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; };
// Assume that only restricted set of texture caps is supported.
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); // Undefined behavior
free(badtex.data);
free(tex.data);
}Возможный вывод:
Segmentation fault
См. также
Документация C++ для unreachable |
Внешние ссылки
| 1. |
Документация GCC: __builtin_unreachable |
| 2. |
Документация Clang: __builtin_unreachable |
| 3. |
Документация MSVC: __assume |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/program/unreachable