Namespaces
Variants

C++ attribute: deprecated (since C++14)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Gibt an, dass der mit diesem Attribut deklarierte Name oder die Entität veraltet ist, das heißt, die Verwendung ist erlaubt, aber aus bestimmten Gründen nicht empfohlen.

Inhaltsverzeichnis

Syntax

[ [ deprecated ] ] (1)
[ [ deprecated ( Zeichenkettenliteral ) ] ] (2)
string-literal - ein unevaluated string literal , der verwendet werden könnte, um die Begründung für die Veraltung zu erläutern und/oder eine Ersatzentität vorzuschlagen

Erklärung

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

Dieses Attribut ist in Deklarationen der folgenden Namen oder Entitäten zulässig:

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

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

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.

Referenzen

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

Siehe auch

C-Dokumentation für deprecated