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
Diesen Code ausführen
#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
|