Namensräume
Varianten
Aktionen

C++ Attribut: noreturn (seit C++11)

Von cppreference.com
< cpp‎ | language‎ | attributes
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 
Attribute
(C++23)
(C++11)(bis C++26)
(C++14)
(C++20)
(C++17)
noreturn
(C++11)
(C++20)
 

Gibt an, dass die Funktion nicht zurückkehrt.

Inhalt

[bearbeiten] Syntax

[[noreturn]]

[bearbeiten] Erklärung

Gibt an, dass die Funktion nach Abschluss die Kontrolle nicht an die aufrufende Funktion zurückgibt (z. B. Funktionen, die die Anwendung beenden, Ausnahmen auslösen, unendlich schleifen usw.). Dieses Attribut gilt nur für den Namen der Funktion, die in Funktionsdeklarationen deklariert wird.

Wenn eine zuvor mit [[noreturn]] deklarierte Funktion aufgerufen wird und dieser Aufruf schließlich zurückkehrt, ist das Verhalten Laufzeit-undefiniert.

Die erste Deklaration der Funktion muss dieses Attribut angeben, wenn irgendeine Deklaration es angibt. Wenn eine Funktion in einer Übersetzungseinheit mit [[noreturn]] deklariert wird und dieselbe Funktion in einer anderen Übersetzungseinheit ohne [[noreturn]] deklariert wird, ist das Programm fehlerhaft; keine Diagnose erforderlich.

[bearbeiten] Beispiel

[[noreturn]] void f()
{
    throw "error";
    // OK
}
 
void q [[noreturn]] (int i)
{
    // behavior is undefined if called with an argument <= 0
    if (i > 0)
        throw "positive";
}
 
// void h() [[noreturn]]; // error: attribute applied to function type of h, not h itself
 
int main()
{
    try { f(); } catch(...) {}
    try { q(42); } catch(...) {}
}

[bearbeiten] Standardbibliothek

Die folgenden Standardfunktionen sind mit dem Attribut noreturn deklariert.

Terminierende Funktionen
(C++11)
verursacht normalen Programmabbruch ohne Bereinigung
(funktion) [bearbeiten]
verursacht abnormalen Programmabbruch (ohne Bereinigung)
(funktion) [bearbeiten]
verursacht normalen Programmabbruch mit Bereinigung
(funktion) [bearbeiten]
verursacht schnellen Programmabbruch ohne vollständige Bereinigung
(funktion) [bearbeiten]
Funktion, die aufgerufen wird, wenn die Ausnahmebehandlung fehlschlägt
(Funktion) [bearbeiten]
(in C++11 veraltet)(in C++17 entfernt)
Funktion, die aufgerufen wird, wenn eine dynamische Ausnahmespezifikation verletzt wird
(Funktion) [bearbeiten]
Compiler-Hinweise
markiert einen unerreichbaren Ausführungspunkt
(funktion) [bearbeiten]
Immer werfende Funktionen
wirft die Ausnahme aus einem std::exception_ptr
(Funktion) [bearbeiten]
wirft die gespeicherte Ausnahme
(public member function von std::nested_exception)
wirft ihr Argument mit std::nested_exception gemischt
(Funktionstemplate) [bearbeiten]
Nicht-lokale Sprünge (seit C++17)
springt zur angegebenen Position
(funktion) [bearbeiten]

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 2924 C++11 Rückkehr aus einer [[noreturn]] Funktion
würde zu undefiniertem Verhalten führen
führt zu Laufzeit-
undefiniertem Verhalten

[bearbeiten] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 9.12.10 Noreturn-Attribut [dcl.attr.noreturn]
  • C++20 Standard (ISO/IEC 14882:2020)
  • 9.12.9 Noreturn-Attribut [dcl.attr.noreturn]
  • C++17 Standard (ISO/IEC 14882:2017)
  • 10.6.8 Noreturn-Attribut [dcl.attr.noreturn]
  • C++14 Standard (ISO/IEC 14882:2014)
  • 7.6.3 Noreturn-Attribut [dcl.attr.noreturn]
  • C++11 Standard (ISO/IEC 14882:2011)
  • 7.6.3 Noreturn-Attribut [dcl.attr.noreturn]

[bearbeiten] Siehe auch

C-Dokumentation für _Noreturn
C-Dokumentation für [[noreturn]]