Oto pełniejsza odpowiedź na rok 2018.
Obecnie wiele narzędzi pozwala nie tylko oznaczyć coś jako przestarzałe, ale także przekazać wiadomość. Dzięki temu możesz poinformować ludzi, że coś zostało wycofane, i może wskazać im zamianę.
Wciąż istnieje duża różnorodność w obsłudze kompilatorów:
- C ++ 14 obsługuje
[[deprecated]]/ [[deprecated(message)]].
__attribute__((deprecated)) jest obsługiwany przez GCC 4.0+ i ARM 4.1+
__attribute__((deprecated))i __attribute__((deprecated(message)))jest obsługiwany przez:
- GCC 4.5+
- Kilka kompilatorów podszywających się pod GCC 4.5+ (przez ustawienie
__GNUC__/ __GNUC_MINOR__/ __GNUC_PATCHLEVEL__)
- Kompilator Intel C / C ++ wraca do co najmniej 16 (nie możesz ufać
__GNUC__/ __GNUC_MINOR__, po prostu ustawili go na dowolną wersję GCC)
- ARM 5.6+
- MSVC obsługuje
__declspec(deprecated)od 13.10 (Visual Studio 2003)
- Obsługa MSVC
__declspec(deprecated(message))od 14,0 (Visual Studio 2005)
Możesz również użyć [[gnu::deprecated]]w najnowszych wersjach clang w C ++ 11, opartych na __has_cpp_attribute(gnu::deprecated).
Mam kilka makr w Hedley do obsługi tego wszystkiego automatycznie, które aktualizuję, ale obecna wersja (v2) wygląda tak:
#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
Zostawię to jako ćwiczenie, aby dowiedzieć się, jak pozbyć się makr *_VERSION_CHECKi, *_HAS_ATTRIBUTEjeśli nie chcesz używać Hedley (napisałem Hedley w dużej mierze, więc nie musiałem o tym regularnie myśleć).
Jeśli używasz GLib, możesz używać makr G_DEPRECATEDi G_DEPRECATED_FOR. Nie są tak wytrzymałe jak te firmy Hedley, ale jeśli już używasz GLib, nie ma nic do dodania.