Aquí es una respuesta más completa para 2018.
En estos días, una gran cantidad de herramientas le permiten no sólo marcar algo como obsoletos, pero también proporciona un mensaje. Esto le permite decirle a las personas cuando algo se desaprobó y tal vez apuntar hacia un reemplazo.
Todavía hay una gran variedad de alimentos en apoyo del compilador:
- C++ 14 soporta
[[deprecated]]
/[[deprecated(message)]]
.
__attribute__((deprecated))
está soportado por GCC 4.0+ y ARM 4.1+
__attribute__((deprecated))
y __attribute__((deprecated(message)))
está soportado para:
- GCC 4.5+
- Varios compiladores que se hacen pasar por GCC 4.5+ (mediante el establecimiento de
__GNUC__
/__GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)
- Compilador Intel C/C++ que se remonta a al menos 16 (no se puede confiar en
__GNUC__
/__GNUC_MINOR__
, simplemente lo configuran para cualquier versión de GCC instalada)
- ARM 5.6+
- MSVC apoya
__declspec(deprecated)
desde 13.10 (Visual Studio 2003)
- MSVC apoya
__declspec(deprecated(message))
desde 14,0 (Visual Studio 2005)
También puede utilizar [[gnu::deprecated]]
en las últimas versiones de sonido metálico en C++ 11, basado en __has_cpp_attribute(gnu::deprecated)
.
Tengo algunas macros en Hedley a manejar todo esto de forma automática que guardo hasta la fecha, 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 dejo como ejercicio para descubra cómo deshacerse de las macros *_VERSION_CHECK
y *_HAS_ATTRIBUTE
si no quiere usar Hedley (escribí Hedley en gran parte para no tener que pensar en eso regularmente).
Si utiliza GLib, puede usar las macros G_DEPRECATED
y G_DEPRECATED_FOR
. No son tan sólidos como los de Hedley, pero si ya usas GLib no hay nada que agregar.
¿Se puede usar [[obsoleto]] en una macro? – Zammbi
@Zammbi Debería poder hacerlo, ya que la macro es manejada por el preprocesador antes de la compilación. [[deprecated]] debería aparecer (y dejar que el compilador muestre advertencias relacionadas) donde se evalúa la macro. –