Aqui está uma resposta mais completa para 2018.
Atualmente, muitas ferramentas permitem não apenas marcar algo como obsoleto, mas também fornecer uma mensagem. Isso permite que você diga às pessoas quando algo foi descontinuado e talvez as aponte para uma substituição.
Ainda há muita variedade no suporte ao compilador:
- O C ++ 14 suporta
[[deprecated]]
/ [[deprecated(message)]]
.
__attribute__((deprecated))
é suportado pelo GCC 4.0+ e ARM 4.1+
__attribute__((deprecated))
e __attribute__((deprecated(message)))
é suportado por:
- GCC 4.5+
- Vários compiladores que se disfarçam como GCC 4.5+ (configurando
__GNUC__
/ __GNUC_MINOR__
/ __GNUC_PATCHLEVEL__
)
- Compilador Intel C / C ++ com pelo menos 16 (você não pode confiar em
__GNUC__
/ __GNUC_MINOR__
, eles apenas o definem para qualquer versão do GCC instalada)
- ARM 5.6+
- O MSVC suporta
__declspec(deprecated)
desde 13.10 (Visual Studio 2003)
- O MSVC suporta
__declspec(deprecated(message))
desde 14.0 (Visual Studio 2005)
Você também pode usar [[gnu::deprecated]]
nas versões recentes do clang no C ++ 11, com base em __has_cpp_attribute(gnu::deprecated)
.
Eu tenho algumas macros no Hedley para lidar com tudo isso automaticamente, que eu mantenho atualizado, mas a versão atual (v2) é assim:
#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
Vou deixar isso como um exercício para descobrir como se livrar das macros *_VERSION_CHECK
e *_HAS_ATTRIBUTE
se você não quiser usar o Hedley (eu escrevi o Hedley amplamente para não precisar pensar nisso regularmente).
Se você usar GLib, você pode usar o G_DEPRECATED
e G_DEPRECATED_FOR
macros. Eles não são tão robustos quanto os da Hedley, mas se você já usa o GLib, não há nada a acrescentar.