Namensräume
Varianten
Aktionen

C++ Attribut: deprecated (seit C++14)

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)
deprecated
(C++14)
(C++20)
(C++17)
(C++11)
(C++20)
 

Gibt an, dass der Name oder die Entität, die mit diesem Attribut deklariert wurde, veraltet ist, d.h. die Verwendung ist erlaubt, aber aus irgendeinem Grund nicht empfohlen.

Inhalt

[edit] Syntax

[[deprecated]] (1)
[[deprecated( string-literal )]] (2)
string-literal - ein nicht ausgewerteter String-Literal, der verwendet werden kann, um die Begründung für die Veralterung zu erklären und/oder eine ersetzende Entität vorzuschlagen

[edit] Erklärung

Gibt an, dass die Verwendung des Namens oder der Entität, die mit diesem Attribut deklariert wurde, erlaubt, aber aus irgendeinem Grund nicht empfohlen ist. Compiler geben typischerweise Warnungen bei solchen Verwendungen aus. Der string-literal, falls angegeben, wird üblicherweise in die Warnungen aufgenommen.

Dieses Attribut ist in Deklarationen der folgenden Namen oder Entitäten erlaubt

  • [[deprecated]] typedef S* PS;,
  • using PS [[deprecated]] = S*;,
  • Aufzählungselement, z.B. enum { A [[deprecated]], B [[deprecated]] = 42 };,
(seit C++17)

Ein nicht als veraltet deklarierter Name kann als veraltet neu deklariert werden. Ein als veraltet deklarierter Name kann nicht durch erneute Deklaration ohne dieses Attribut wieder als nicht veraltet markiert werden.

[edit] Beispiel

#include <iostream>
 
[[deprecated]]
void TriassicPeriod()
{
    std::clog << "Triassic Period: [251.9 - 208.5] million years ago.\n";
}
 
[[deprecated("Use NeogenePeriod() instead.")]]
void JurassicPeriod()
{
    std::clog << "Jurassic Period: [201.3 - 152.1] million years ago.\n";
}
 
[[deprecated("Use calcSomethingDifferently(int).")]]
int calcSomething(int x)
{
    return x * 2;
}
 
int main()
{
    TriassicPeriod();
    JurassicPeriod();
}

Mögliche Ausgabe

Triassic Period: [251.9 - 208.5] million years ago.
Jurassic Period: [201.3 - 152.1] million years ago.
 
main.cpp:20:5: warning: 'TriassicPeriod' is deprecated [-Wdeprecated-declarations]
    TriassicPeriod();
    ^
main.cpp:3:3: note: 'TriassicPeriod' has been explicitly marked deprecated here
[[deprecated]]
  ^
main.cpp:21:5: warning: 'JurassicPeriod' is deprecated: Use NeogenePeriod() instead ⮠
 [-Wdeprecated-declarations]
    JurassicPeriod();
    ^
main.cpp:8:3: note: 'JurassicPeriod' has been explicitly marked deprecated here
[[deprecated("Use NeogenePeriod() instead")]]
  ^
2 warnings generated.

[edit] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 9.12.5 Veraltet-Attribut [dcl.attr.deprecated]
  • C++20 Standard (ISO/IEC 14882:2020)
  • 9.12.4 Veraltet-Attribut [dcl.attr.deprecated]
  • C++17 Standard (ISO/IEC 14882:2017)
  • 10.6.4 Veraltet-Attribut [dcl.attr.deprecated]
  • C++14 Standard (ISO/IEC 14882:2014)
  • 7.6.5 Veraltet-Attribut [dcl.attr.deprecated]

[edit] Siehe auch

C-Dokumentation für deprecated