Вот более полный ответ на 2018.
В наши дни множество инструментов позволяют вам не просто помечать что-то как устаревшее, но и предоставлять сообщение. Это позволяет вам сообщать людям, когда что-то осуждается, и, возможно, указывать им на замену.
По-прежнему существует большое разнообразие в поддержке компиляторов:
- C ++ 14 поддерживает
[[deprecated]]
/ [[deprecated(message)]]
.
__attribute__((deprecated))
поддерживается GCC 4.0+ и ARM 4.1 +
__attribute__((deprecated))
и __attribute__((deprecated(message)))
поддерживаются для:
- GCC 4.5 +
- Несколько компиляторов, маскирующихся под GCC 4.5+ (путем установки
__GNUC__
/ __GNUC_MINOR__
/ __GNUC_PATCHLEVEL__
)
- Компилятор Intel C / C ++ возвращается по крайней мере к 16 (вы не можете доверять
__GNUC__
/ __GNUC_MINOR__
, они просто устанавливают его на любую установленную версию GCC)
- ARM 5.6 +
- MSVC поддерживает
__declspec(deprecated)
с 13.10 (Visual Studio 2003)
- MSVC поддерживает
__declspec(deprecated(message))
с 14.0 (Visual Studio 2005)
Вы также можете использовать [[gnu::deprecated]]
в последних версиях clang на C ++ 11, основанных на __has_cpp_attribute(gnu::deprecated)
.
У меня есть несколько макросов в Hedley для автоматической обработки всего этого, что я постоянно обновляю, но текущая версия (v2) выглядит следующим образом:
#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
Я оставлю это в качестве упражнения, чтобы выяснить, как избавиться от макросов *_VERSION_CHECK
и *_HAS_ATTRIBUTE
, если вы не хотите использовать Хедли (я написал Хедли в значительной степени, чтобы мне не приходилось думать об этом на регулярной основе).
Если вы используете GLib, вы можете использовать макросы G_DEPRECATED
и G_DEPRECATED_FOR
. Они не такие надежные, как у Hedley, но если вы уже используете GLib, добавить нечего.