Voici une réponse plus complète pour 2018.
De nos jours, de nombreux outils vous permettent non seulement de marquer quelque chose comme obsolète, mais également de fournir un message. Cela vous permet de dire aux gens quand quelque chose est obsolète et peut-être de les diriger vers un remplacement.
Il y a encore beaucoup de variété dans le support du compilateur:
- C ++ 14 prend en charge
[[deprecated]]
/ [[deprecated(message)]]
.
__attribute__((deprecated))
est pris en charge par GCC 4.0+ et ARM 4.1+
__attribute__((deprecated))
et __attribute__((deprecated(message)))
est pris en charge pour:
- GCC 4.5+
- Plusieurs compilateurs qui se font passer pour GCC 4.5+ (en définissant
__GNUC__
/ __GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)
- Compilateur Intel C / C ++ remontant à au moins 16 (vous ne pouvez pas faire confiance à
__GNUC__
/ __GNUC_MINOR__
, ils le définissent simplement sur la version de GCC installée)
- ARM 5.6+
- MSVC prend en charge
__declspec(deprecated)
depuis 13.10 (Visual Studio 2003)
- MSVC prend en charge
__declspec(deprecated(message))
depuis 14.0 (Visual Studio 2005)
Vous pouvez également utiliser [[gnu::deprecated]]
dans les versions récentes de clang en C ++ 11, basé sur __has_cpp_attribute(gnu::deprecated)
.
J'ai quelques macros dans Hedley pour gérer tout cela automatiquement que je tiens à jour, mais la version actuelle (v2) ressemble à ceci:
#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
Je vais laisser comme un exercice pour savoir comment se débarrasser des *_VERSION_CHECK
et*_HAS_ATTRIBUTE
macros si vous ne voulez pas utiliser Hedley (j'ai écrit Hedley en grande partie pour ne pas avoir à y penser régulièrement).
Si vous utilisez GLib, vous pouvez utiliser les macros G_DEPRECATED
et G_DEPRECATED_FOR
. Ils ne sont pas aussi robustes que ceux de Hedley, mais si vous utilisez déjà GLib, il n'y a rien à ajouter.