unreachable
Von cppreference.com
< c | Programmierung
| Definiert im Header <stddef.h> |
||
| #define unreachable() /* siehe unten */ |
(seit C23) | |
Das funktionsähnliche Makro unreachable expandiert zu einem Ausdruck vom Typ void. Die Ausführung von unreachable() führt zu nicht definiertem Verhalten.
Eine Implementierung kann dies nutzen, um unmögliche Codezweige zu optimieren (typischerweise in optimierten Builds) oder um sie zu fangen, um eine weitere Ausführung zu verhindern (typischerweise in Debug-Builds).
Inhalt |
[bearbeiten] Mögliche Implementierung
// Uses compiler specific extensions if possible. #ifdef __GNUC__ // GCC, Clang, ICC #define unreachable() (__builtin_unreachable()) #elifdef _MSC_VER // MSVC #define unreachable() (__assume(false)) #else // Even if no extension is used, undefined behavior is still raised by // the empty function body and the noreturn attribute. // The external definition of unreachable_impl must be emitted in a separated TU // due to the rule for inline functions in C. [[noreturn]] inline void unreachable_impl() {} #define unreachable() (unreachable_impl()) #endif |
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#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; }; // Assume that only restricted set of texture caps is supported. 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); // Undefined behavior free(badtex.data); free(tex.data); }
Mögliche Ausgabe
Segmentation fault
[bearbeiten] Siehe auch
| C++-Dokumentation für unreachable
|
[bearbeiten] Externe Links
| 1. | GCC-Doku: __builtin_unreachable
|
| 2. | Clang-Doku: __builtin_unreachable
|
| 3. | MSVC-Doku: __assume
|