Schlüsselwort _Noreturn und Makro noreturn (C11)

Das Schlüsselwort _Noreturn wurde in C11 eingeführt. Es teilt dem Compiler mit, dass die Funktion, auf die es angewendet wird, nichts an den Aufrufer zurückgibt. Der Compiler weiß, dass der Code, der auf einen Aufruf einer _Noreturn-Funktion folgt, nicht erreichbar ist. Ein Beispiel für eine Funktion, die nichts zurückgibt, ist abort. Wenn die Möglichkeit besteht, dass die Ablaufsteuerung etwas an den Aufrufer zurückgibt, darf die Funktion nicht über das _Noreturn-Attribut verfügen.

Das Schlüsselwort wird in der Regel über das in <stdnoreturn.h> bereitgestellte Hilfsmakro noreturn verwendet, das dem Schlüsselwort _Noreturn zugeordnet ist.

Die Hauptvorteile der Verwendung von _Noreturn (oder der Entsprechung noreturn) sind, dass die Absicht der Funktion im Code für zukünftige Leser deutlich wird und unabsichtlich nicht erreichbarer Code erkannt wird.

Eine mit noreturn gekennzeichnete Funktion sollte keinen Rückgabetyp enthalten, da sie keinen Wert an den Aufrufer zurückgibt. Diese sollte void lauten.

Beispiel für die Verwendung des Makros noreturn und des Schlüsselworts _Noreturn

Das folgende Beispiel zeigt die Verwendung des Schlüsselworts _Noreturn und des entsprechenden Makros noreturn.

IntelliSense generiert bei Verwendung des Makros noreturn möglicherweise einen falschen Fehler (E0065), den Sie ignorieren können. Die Ausführung des Beispiels wird nicht verhindert.

// Compile with Warning Level4 (/W4) and /std:c11
#include <stdio.h>
#include <stdlib.h>
#include <stdnoreturn.h>

noreturn void fatal_error(void)
{
    exit(3);
}

_Noreturn void not_coming_back(void)
{
    puts("There's no coming back");
    fatal_error();
    return; // warning C4645 - function declared with noreturn has a return statement
}

void done(void)
{
    puts("We'll never get here");
}

int main(void)
{
    not_coming_back();
    done(); // warning c4702 - unreachable code

    return 0;
}

Anforderungen

Makro Erforderlicher Header
noreturn <stdnoreturn.h>

Siehe auch

/std (Angeben der Standardsprachversion)
/W4 (Angeben der Warnstufe)
Warnung C4702
__declspec(noreturn)