Ini jawaban yang lebih lengkap untuk 2018.
Saat ini, banyak alat memungkinkan Anda untuk tidak hanya menandai sesuatu yang sudah usang, tetapi juga memberikan pesan. Ini memungkinkan Anda memberi tahu orang-orang ketika ada sesuatu yang sudah ketinggalan zaman, dan mungkin mengarahkan mereka ke pengganti.
Masih ada banyak variasi dalam dukungan compiler:
- C ++ 14 mendukung
[[deprecated]]
/ [[deprecated(message)]]
.
__attribute__((deprecated))
didukung oleh GCC 4.0+ dan ARM 4.1+
__attribute__((deprecated))
dan __attribute__((deprecated(message)))
didukung untuk:
- GCC 4.5+
- Beberapa kompiler yang menyamar sebagai GCC 4.5+ (dengan menetapkan
__GNUC__
/ __GNUC_MINOR__
/ __GNUC_PATCHLEVEL__
)
- Intel C / C ++ Compiler akan kembali ke setidaknya 16 (Anda tidak bisa percaya
__GNUC__
/ __GNUC_MINOR__
, mereka hanya mengaturnya ke versi GCC apa pun yang diinstal)
- ARM 5.6+
- MSVC mendukung
__declspec(deprecated)
sejak 13.10 (Visual Studio 2003)
- MSVC mendukung
__declspec(deprecated(message))
sejak 14.0 (Visual Studio 2005)
Anda juga dapat menggunakan [[gnu::deprecated]]
dentang versi terbaru di C ++ 11, berdasarkan __has_cpp_attribute(gnu::deprecated)
.
Saya memiliki beberapa makro di Hedley untuk menangani semua ini secara otomatis yang saya perbarui, tetapi versi saat ini (v2) terlihat seperti ini:
#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
Saya akan meninggalkannya sebagai latihan untuk mengetahui cara menyingkirkan *_VERSION_CHECK
dan *_HAS_ATTRIBUTE
makro jika Anda tidak ingin menggunakan Hedley (saya menulis Hedley sebagian besar jadi saya tidak perlu memikirkannya secara teratur).
Jika Anda menggunakan GLib, Anda bisa menggunakan G_DEPRECATED
dan G_DEPRECATED_FOR
makro. Mereka tidak sekuat yang dari Hedley, tetapi jika Anda sudah menggunakan GLib tidak ada yang perlu ditambahkan.