Namespaces
Variants

unreachable

From cppreference.net
Definiert im Header <stddef.h>
#define unreachable() /* siehe unten */
(seit C23)

Das makroartige Konstrukt unreachable expandiert zu einem void -Ausdruck. Die Ausführung von unreachable ( ) führt zu undefiniertem Verhalten .

Eine Implementierung kann dies verwenden, um unmögliche Codezweige zu entfernen (typischerweise in optimierten Builds) oder um sie abzufangen, um weitere Ausführung zu verhindern (typischerweise in Debug-Builds).

Inhaltsverzeichnis

Mögliche Implementierung

// Verwendet compilerspezifische Erweiterungen wenn möglich.
#ifdef __GNUC__ // GCC, Clang, ICC
#define unreachable() (__builtin_unreachable())
#elifdef _MSC_VER // MSVC
#define unreachable() (__assume(false))
#else
// Selbst wenn keine Erweiterung verwendet wird, wird undefiniertes Verhalten immer noch ausgelöst durch
// den leeren Funktionskörper und das noreturn-Attribut.
// Die externe Definition von unreachable_impl muss in einer separaten Übersetzungseinheit ausgegeben werden
// aufgrund der Regel für Inline-Funktionen in C.
[[noreturn]] inline void unreachable_impl() {}
#define unreachable() (unreachable_impl())
#endif

Beispiel

#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; };
// Angenommen, nur ein eingeschränkter Satz von Texturkapazitäten wird unterstützt.
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);  // Undefiniertes Verhalten
    free(badtex.data);
    free(tex.data);
}

Mögliche Ausgabe:

Segmentation fault

Siehe auch

C++ Dokumentation für unreachable

Externe Links

1. GCC-Dokumentation: __builtin_unreachable
2. Clang-Dokumentation: __builtin_unreachable
3. MSVC-Dokumentation: __assume