In C ++ 14 können Sie eine Funktion mithilfe des [[deprecated]]
Attributs als veraltet markieren (siehe Abschnitt 7.6.5 [dcl.attr.deprecated]).
Das Attribut-Token deprecated
kann verwendet werden, um Namen und Entitäten zu markieren, deren Verwendung noch zulässig ist, aus irgendeinem Grund jedoch nicht empfohlen wird.
Die folgende Funktion foo
ist beispielsweise veraltet:
[[deprecated]]
void foo(int);
Es ist möglich, eine Nachricht bereitzustellen, die beschreibt, warum der Name oder die Entität veraltet war:
[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);
Die Nachricht muss ein String-Literal sein.
Weitere Informationen finden Sie unter „In C ++ 14 als veraltet markieren“ .
Dies sollte den Trick tun:
Es treten jedoch Probleme auf, wenn ein Funktionsrückgabetyp ein Komma im Namen hat, z. B.
std::pair<int, int>
da dies vom Präprozessor so interpretiert wird, dass 2 Argumente an das Makro DEPRECATED übergeben werden. In diesem Fall müssten Sie den Rückgabetyp eingeben.Bearbeiten: einfachere (aber möglicherweise weniger weitgehend kompatible) Version hier .
quelle
__declspec(deprecated)
jetzt befindet, sodass das Makro vereinfacht werden kann.Hier ist eine vereinfachte Version meiner Antwort von 2008 :
Siehe auch:
__declspec(deprecated)
__attribute__((deprecated))
__attribute__((deprecated))
quelle
[[deprecate]]
Ihre veralteten Makros? :-)DEPRECATED void foo(...);
stattDEPRECATED(void foo(...));
In GCC können Sie Ihre Funktion mit dem folgenden Attribut deklarieren:
Dies löst eine Warnung zur Kompilierungszeit aus, wenn diese Funktion in einer .c-Datei verwendet wird.
Weitere Informationen finden Sie unter "Diagnostic Pragmas" unter http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html
quelle
Hier ist eine vollständigere Antwort für 2018.
Heutzutage können Sie mit vielen Tools nicht nur etwas als veraltet markieren, sondern auch eine Nachricht bereitstellen. Auf diese Weise können Sie Personen mitteilen, wenn etwas veraltet ist, und sie möglicherweise auf einen Ersatz hinweisen.
Die Compiler-Unterstützung ist immer noch sehr vielfältig:
[[deprecated]]
/[[deprecated(message)]]
.__attribute__((deprecated))
wird von GCC 4.0+ und ARM 4.1+ unterstützt__attribute__((deprecated))
und__attribute__((deprecated(message)))
wird unterstützt für:__GNUC__
/__GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)__GNUC__
/__GNUC_MINOR__
, sie setzen es einfach auf die Version von GCC, die installiert ist)__declspec(deprecated)
seit 13.10 (Visual Studio 2003)__declspec(deprecated(message))
seit 14.0 (Visual Studio 2005)Sie können auch
[[gnu::deprecated]]
in neueren Versionen von clang in C ++ 11 verwenden, basierend auf__has_cpp_attribute(gnu::deprecated)
.Ich habe einige Makros in Hedley , um all dies automatisch zu erledigen, die ich auf dem neuesten Stand halte, aber die aktuelle Version (v2) sieht folgendermaßen aus:
Ich lasse es als Übung, um herauszufinden, wie man das
*_VERSION_CHECK
und loswird*_HAS_ATTRIBUTE
Makros wenn man Hedley nicht verwenden möchte (ich habe Hedley größtenteils geschrieben, damit ich nicht regelmäßig darüber nachdenken muss).Wenn Sie GLib verwenden, können Sie die Makros
G_DEPRECATED
und verwendenG_DEPRECATED_FOR
. Sie sind nicht so robust wie die von Hedley, aber wenn Sie bereits GLib verwenden, gibt es nichts hinzuzufügen.quelle
Bei tragbaren Projekten ist es fast unvermeidlich, dass Sie irgendwann einen Abschnitt vorverarbeiteter Alternativen für eine Reihe von Plattformen benötigen. #ifdef this #ifdef that und so weiter.
In einem solchen Abschnitt können Sie sehr gut eine Möglichkeit definieren, Symbole zu verwerfen. Normalerweise definiere ich lieber ein "Warn" -Makro, da die meisten Toolchains benutzerdefinierte Compiler-Warnungen unterstützen. Anschließend können Sie mit einem bestimmten Warnmakro für Verfall usw. fortfahren. Für Plattformen, die dedizierte Verfallsmethoden unterstützen, können Sie dieses anstelle von Warnungen verwenden.
quelle
Verwenden Sie dies für Intel Compiler v19.0 als
__INTEL_COMPILER
Auswertung für1900
:Funktioniert für die folgenden Sprachniveaus:
Der Intel Compiler hat den Anschein, dass er das
[[deprecated]]
Attribut für bestimmte Sprachelemente, das alle anderen Compiler ausführen, nicht unterstützt . Kompilieren Sie beispielsweise v6.0.0 der (bemerkenswert hervorragenden) {fmtlib / fmt} -Bibliothek auf GitHub mit Intel Compiler v19.0. Es wird brechen. Dann sehen Sie sich das Update im GitHub-Commit an .quelle
__attribute__((deprecated))
, OTOH, funktioniert in C und C ++ und geht auf mindestens ICC 13.0 zurück, wahrscheinlich viel weiter (Intel neigt dazu, solche Dinge nicht zu dokumentieren, daher kann ich nicht sicher sein).