Aquí hay una respuesta más completa para 2018.
En la actualidad, muchas herramientas le permiten no solo marcar algo como obsoleto, sino también enviar un mensaje. Esto le permite informar a las personas cuando algo ha quedado en desuso, y tal vez señalarles hacia un reemplazo.
Todavía hay mucha variedad en el soporte del compilador:
- C ++ 14 soporta
[[deprecated]]/ [[deprecated(message)]].
__attribute__((deprecated)) es compatible con GCC 4.0+ y ARM 4.1+
__attribute__((deprecated))y __attribute__((deprecated(message)))es compatible con:
- GCC 4.5+
- Varios compiladores que se hacen pasar por GCC 4.5+ (configurando
__GNUC__/ __GNUC_MINOR__/ __GNUC_PATCHLEVEL__)
- El compilador Intel C / C ++ se remonta al menos a 16 (no puede confiar
__GNUC__/ __GNUC_MINOR__simplemente lo configuran a cualquier versión de GCC instalada)
- BRAZO 5.6+
- MSVC admite
__declspec(deprecated)desde 13.10 (Visual Studio 2003)
- MSVC admite
__declspec(deprecated(message))desde 14.0 (Visual Studio 2005)
También puede usar [[gnu::deprecated]]en versiones recientes de clang en C ++ 11, basado en __has_cpp_attribute(gnu::deprecated).
Tengo algunas macros en Hedley para manejar todo esto automáticamente, que mantengo actualizado, pero la versión actual (v2) se ve así:
#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
Lo dejaré como un ejercicio para descubrir cómo deshacerse de las macros *_VERSION_CHECKy *_HAS_ATTRIBUTEsi no desea usar Hedley (escribí Hedley en gran parte para no tener que pensar en eso regularmente).
Si usa GLib, puede usar las macros G_DEPRECATEDy G_DEPRECATED_FOR. No son tan robustos como los de Hedley, pero si ya usa GLib no hay nada que agregar.