Ось більш повна відповідь на 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)
.
У Хедлі у мене є кілька макросів, які автоматично обробляють все це, що я постійно оновлюю, але поточна версія (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, нічого додати.