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:
- C ++ 14 unterstützt
[[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:
- GCC 4.5+
- Mehrere Compiler, die sich als GCC 4.5+ tarnen (durch Setzen von
__GNUC__
/ __GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)
- Intel C / C ++ Compiler geht auf mindestens 16 zurück (Sie können nicht vertrauen
__GNUC__
/ __GNUC_MINOR__
, sie setzen es einfach auf die Version von GCC, die installiert ist)
- ARM 5.6+
- MSVC unterstützt
__declspec(deprecated)
seit 13.10 (Visual Studio 2003)
- MSVC unterstützt
__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:
#if defined(__cplusplus) && (__cplusplus >= 201402L)
# define HEDLEY_DEPRECATED(since) [[deprecated("Since " #since)]]
# define HEDLEY_DEPRECATED_FOR(since, replacement) [[deprecated("Since " #since "; use " #replacement)]]
#elif \
HEDLEY_GCC_HAS_EXTENSION(attribute_deprecated_with_message,4,5,0) || \
HEDLEY_INTEL_VERSION_CHECK(16,0,0) || \
HEDLEY_ARM_VERSION_CHECK(5,6,0)
# define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since)))
# define HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement)))
#elif \
HEDLEY_GCC_HAS_ATTRIBUTE(deprcated,4,0,0) || \
HEDLEY_ARM_VERSION_CHECK(4,1,0)
# define HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
# define HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))
#elif HEDLEY_MSVC_VERSION_CHECK(14,0,0)
# define HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since))
# define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement))
#elif HEDLEY_MSVC_VERSION_CHECK(13,10,0)
# define HEDLEY_DEPRECATED(since) _declspec(deprecated)
# define HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
#else
# define HEDLEY_DEPRECATED(since)
# define HEDLEY_DEPRECATED_FOR(since, replacement)
#endif
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 verwenden G_DEPRECATED_FOR
. Sie sind nicht so robust wie die von Hedley, aber wenn Sie bereits GLib verwenden, gibt es nichts hinzuzufügen.