unreachable
From cppreference.net
|
Definido en el encabezado
<stddef.h>
|
||
|
#define unreachable() /* ver más abajo */
|
(desde C23) | |
La macro similar a función
unreachable
se expande a una expresión
void
. Ejecutar
unreachable
(
)
resulta en
comportamiento indefinido
.
Una implementación puede usar esto para optimizar eliminando ramas de código imposibles (típicamente, en builds optimizados) o para atraparlas y prevenir una ejecución posterior (típicamente, en builds de depuración).
Contenidos |
Implementación posible
// Utiliza extensiones específicas del compilador si es posible. #ifdef __GNUC__ // GCC, Clang, ICC #define unreachable() (__builtin_unreachable()) #elifdef _MSC_VER // MSVC #define unreachable() (__assume(false)) #else // Incluso si no se utiliza ninguna extensión, el comportamiento indefinido sigue siendo generado por // el cuerpo de función vacío y el atributo noreturn. // La definición externa de unreachable_impl debe emitirse en una unidad de traducción separada // debido a la regla para funciones inline en C. [[noreturn]] inline void unreachable_impl() {} #define unreachable() (unreachable_impl()) #endif |
Ejemplo
Ejecutar este código
#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; }; // Asumir que solo se admite un conjunto restringido de capacidades de textura. 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); // Correcto assert(tex.size == 128 * 128); struct ColorSpan badtex = allocate_texture(32); // Comportamiento indefinido free(badtex.data); free(tex.data); }
Salida posible:
Fallo de segmentación
Véase también
|
Documentación de C++
para
unreachable
|
Enlaces Externos
| 1. |
Documentación de GCC:
__builtin_unreachable
|
| 2. |
Documentación de Clang:
__builtin_unreachable
|
| 3. |
Documentación de MSVC:
__assume
|