Voici une réponse plus complète pour 2018.
Ces jours-ci, beaucoup d'outils vous permettent de ne pas marquer quelque chose comme dépréciée, mais également fournir un message. Cela vous permet de dire aux gens quand quelque chose a été déprécié, et peut-être les diriger vers un remplacement.
Il y a encore beaucoup de variété dans le soutien du compilateur:
- 14 C++ prend en charge
[[deprecated]]
/[[deprecated(message)]]
.
__attribute__((deprecated))
est supporté par GCC 4.0+ et ARM 4.1+
__attribute__((deprecated))
et __attribute__((deprecated(message)))
est supporté pour:
- GCC 4.5+
- Plusieurs compilateurs qui font passer pour GCC 4.5+ (en définissant
__GNUC__
/__GNUC_MINOR__
/)
- Compilateur Intel C/C++ remontant à au moins 16 (vous ne pouvez pas faire confiance
__GNUC__
/__GNUC_MINOR__
, ils le définissent simplement à la version de GCC est installée)
- ARM 5.6+
- MSVC soutient
__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 garde jusqu'à ce 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 à comprendre comment se débarrasser des macros *_VERSION_CHECK
et *_HAS_ATTRIBUTE
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.
Pouvez-vous utiliser [[déprécié]] dans une macro? – Zammbi
@Zammbi Vous devriez pouvoir, car la macro est traitée par le préprocesseur avant la compilation. [[obsolète]] devrait apparaître (et laisser les avertissements liés à la sortie du compilateur) où la macro est évaluée. –