İşte 2018 için daha eksiksiz bir cevap.
Bugünlerde pek çok araç, bir şeyi sadece kullanımdan kaldırıldı olarak işaretlemenize değil, aynı zamanda bir mesaj vermenize de izin veriyor. Bu, insanlara bir şeyin ne zaman kullanımdan kaldırıldığını söylemenize ve belki onları değiştirmeye yönlendirmenize olanak tanır.
Derleyici desteğinde hala çok fazla çeşitlilik var:
- C ++ 14,
[[deprecated]]
/ [[deprecated(message)]]
.
__attribute__((deprecated))
GCC 4.0+ ve ARM 4.1+ tarafından desteklenmektedir
__attribute__((deprecated))
ve __attribute__((deprecated(message)))
şunlar için desteklenir:
- GCC 4.5+
- GCC 4.5+ gibi görünen birkaç derleyici (
__GNUC__
/ __GNUC_MINOR__
/ ayarlayarak __GNUC_PATCHLEVEL__
)
- En az 16'ya geri dönen Intel C / C ++ Derleyici (güvenemezsiniz
__GNUC__
/ __GNUC_MINOR__
, sadece GCC'nin hangi sürümünün yüklü olduğunu ayarlarlar)
- ARM 5.6+
- MSVC, 13.10'dan
__declspec(deprecated)
beri desteklemektedir (Visual Studio 2003)
- MSVC, 14.0'dan
__declspec(deprecated(message))
beri desteklemektedir (Visual Studio 2005)
Ayrıca [[gnu::deprecated]]
clang'ın son sürümlerinde C ++ 11'de __has_cpp_attribute(gnu::deprecated)
.
Hedley'de tüm bunları otomatik olarak işlemek için güncel tuttuğum bazı makrolarım var , ancak mevcut sürüm (v2) şöyle görünüyor:
#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
Hedley'i kullanmak istemiyorsanız , *_VERSION_CHECK
ve *_HAS_ATTRIBUTE
makrolardan nasıl kurtulacağınızı anlamak için bir egzersiz olarak bırakacağım (büyük ölçüde Hedley'i yazdım, böylece bunu düzenli olarak düşünmek zorunda kalmayayım).
GLib kullanıyorsanız, G_DEPRECATED
ve G_DEPRECATED_FOR
makrolarını kullanabilirsiniz . Hedley'den olanlar kadar sağlam değiller, ancak GLib'i zaten kullanıyorsanız ekleyecek hiçbir şey yok.