unreachable
From cppreference.net
|
Défini dans l'en-tête
<stddef.h>
|
||
|
#define unreachable() /* voir ci-dessous */
|
(depuis C23) | |
La macro de type fonction
unreachable
se développe en une expression
void
. L'exécution de
unreachable
(
)
entraîne un
comportement indéfini
.
Une implémentation peut utiliser cela pour optimiser en éliminant les branches de code impossibles (généralement, dans les versions optimisées) ou pour les piéger afin d'empêcher toute exécution ultérieure (généralement, dans les versions de débogage).
Table des matières |
Implémentation possible
// Utilise des extensions spécifiques au compilateur si possible. #ifdef __GNUC__ // GCC, Clang, ICC #define unreachable() (__builtin_unreachable()) #elifdef _MSC_VER // MSVC #define unreachable() (__assume(false)) #else // Même si aucune extension n'est utilisée, un comportement indéfini est toujours provoqué par // le corps de fonction vide et l'attribut noreturn. // La définition externe de unreachable_impl doit être émise dans une unité de traduction séparée // en raison de la règle pour les fonctions inline en C. [[noreturn]] inline void unreachable_impl() {} #define unreachable() (unreachable_impl()) #endif |
Exemple
Exécuter ce code
#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; }; // Supposons que seul un ensemble restreint de capacités de texture est pris en charge. 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); // Comportement indéfini free(badtex.data); free(tex.data); }
Sortie possible :
Segmentation fault
Voir aussi
|
Documentation C++
pour
unreachable
|
Liens Externes
| 1. |
Documentation GCC :
__builtin_unreachable
|
| 2. |
Documentation Clang :
__builtin_unreachable
|
| 3. |
Documentation MSVC :
__assume
|