noreturn

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Schlüsselwörter alphabetisch - Index


<ideTag id="noreturn"></ideTag>

Syntax

FUNCTION NAME [[noreturn]]

Beschreibung

Das Attribut noreturn legt fest, dass eine Funktion nicht zurückkehrt; beispielsweise Funktionen, die die Anwendung beenden, eine Endlosschleife ausführen oder Exceptions auslösen. Das bedeutet, dass die aufrufende Funktion die Steuerung nicht zurückerhält. Wenn eine mit noreturn gekennzeichnete Funktion aufgerufen wird und irgendwann eine return-Anweisung ausführt, ist das Programm nicht wohlgeformt, und der Compiler gibt eine Meldung aus.

Zum Beispiel:

void f [[noreturn]] () 
{
   throw "error";	// OK
}
 
void g [[noreturn]] (int i) 
{  // nicht wohlgeformt
   if (i > 0)
      throw "positive";
}

In diesem Beispiel erzeugt der Compiler einen E2541-Fehler, weil g void zurückgibt, wenn i kleiner oder gleich 0 ist.

Das Attribut noreturn ist für einige Bibliotheksfunktionen nützlich, die nicht zurückkehren können, wie z.B. abort und exit (C++). Sie können mit dem Attribut noreturn auch eigene Funktionen definieren, die nie zurückkehren.

Zum Beispiel:

void fatal(void) [[noreturn]];
void fatal(void)
{
   // ...
   exit(1);
}

Das Schlüsselwort noreturn teilt dem C++-Compiler mit, dass fatal nicht zurückkehren kann. Der Compiler kann dann Optimierungen ohne Rücksicht darauf vornehmen, was geschehen würde, wenn fatal zurückkehrt. Daher kann der Quelltext durch die Verwendung von noreturn verbessert werden. Wichtiger ist aber, dass noreturn unechte Pseudowarnungen von nicht initialisierten Variablen zu verhindern hilft. Sie können nicht davon ausgehen, dass von der aufrufenden Funktion gespeicherte Register vor dem Aufruf der Funktion mit dem Attribut noreturn wiederhergestellt werden. noreturn-Funktionen sollten immer den Rückgabetyp void haben (alles andere wäre sinnlos).

Portabilität

POSIX  Win32  Win64  ANSI C  ANSI C++

deprecated

+

Hinweis: Das Attribut noreturn wird von C++-Compilern, die durch Clang erweitert wurden, nicht unterstützt.

Siehe auch