Ecco una risposta più completa per il 2018.
In questi giorni, molti strumenti ti consentono non solo di contrassegnare qualcosa come deprecato, ma anche di fornire un messaggio. Questo ti permette di dire alle persone quando qualcosa è stato deprecato e forse di indirizzarle verso un sostituto.
C'è ancora molta varietà nel supporto del compilatore:
- C ++ 14 supporta
[[deprecated]]/ [[deprecated(message)]].
__attribute__((deprecated)) è supportato da GCC 4.0+ e ARM 4.1+
__attribute__((deprecated))ed __attribute__((deprecated(message)))è supportato per:
- GCC 4.5+
- Diversi compilatori che si mascherano come GCC 4.5+ (impostando
__GNUC__/ __GNUC_MINOR__/__GNUC_PATCHLEVEL__ )
- Compilatore Intel C / C ++ che risale almeno al 16 (non ci si può fidare
__GNUC__/ __GNUC_MINOR__, lo hanno semplicemente impostato su qualsiasi versione di GCC installata)
- ARM 5.6+
- MSVC supporta
__declspec(deprecated)dal 13.10 (Visual Studio 2003)
- MSVC supporta
__declspec(deprecated(message))dalla 14.0 (Visual Studio 2005)
È inoltre possibile utilizzare [[gnu::deprecated]]in versioni recenti di clang in C ++ 11, basato su __has_cpp_attribute(gnu::deprecated).
Ho alcune macro in Hedley per gestire tutto questo automaticamente, che tengo aggiornato, ma la versione corrente (v2) è simile a questa:
#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
Lascerò come un esercizio per capire come sbarazzarsi di macro *_VERSION_CHECKe *_HAS_ATTRIBUTEse non si desidera utilizzare Hedley (ho scritto Hedley in gran parte, quindi non dovrei pensarci su base regolare).
Se si utilizza GLib, è possibile utilizzare le macro G_DEPRECATEDe G_DEPRECATED_FOR. Non sono robusti come quelli di Hedley, ma se usi già GLib non c'è nulla da aggiungere.