Namespaces
Variants

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

#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