Dưới đây là một câu trả lời đầy đủ hơn cho năm 2018.
Ngày nay, rất nhiều công cụ cho phép bạn không chỉ đánh dấu một cái gì đó bị phản đối mà còn cung cấp một thông điệp. Điều này cho phép bạn nói với mọi người khi một cái gì đó không được chấp nhận và có thể hướng họ đến một sự thay thế.
Vẫn còn rất nhiều sự hỗ trợ trong trình biên dịch:
- C ++ 14 hỗ trợ
[[deprecated]]
/ [[deprecated(message)]]
.
__attribute__((deprecated))
được hỗ trợ bởi GCC 4.0+ và ARM 4.1+
__attribute__((deprecated))
và __attribute__((deprecated(message)))
được hỗ trợ cho:
- GCC 4.5+
- Một số trình biên dịch giả dạng GCC 4.5+ (bằng cách đặt
__GNUC__
/ __GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)
- Trình biên dịch Intel C / C ++ trở lại ít nhất 16 (bạn không thể tin tưởng
__GNUC__
/ __GNUC_MINOR__
, họ chỉ cần đặt nó thành bất kỳ phiên bản GCC nào được cài đặt)
- ARM 5.6+
- MSVC hỗ trợ
__declspec(deprecated)
kể từ ngày 13.10 (Visual Studio 2003)
- MSVC hỗ trợ
__declspec(deprecated(message))
kể từ 14.0 (Visual Studio 2005)
Bạn cũng có thể sử dụng [[gnu::deprecated]]
các phiên bản clang gần đây trong C ++ 11, dựa trên __has_cpp_attribute(gnu::deprecated)
.
Tôi có một số macro trong Hedley để tự động xử lý tất cả những điều này mà tôi luôn cập nhật, nhưng phiên bản hiện tại (v2) trông như thế này:
#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
Tôi sẽ để nó như một bài tập để tìm ra cách thoát khỏi *_VERSION_CHECK
và*_HAS_ATTRIBUTE
macro nếu bạn không muốn sử dụng Hedley (Tôi đã viết phần lớn Hedley vì vậy tôi sẽ không phải suy nghĩ về điều đó một cách thường xuyên).
Nếu bạn sử dụng GLib, bạn có thể sử dụng G_DEPRECATED
và G_DEPRECATED_FOR
macro. Chúng không mạnh như của Hedley, nhưng nếu bạn đã sử dụng GLib thì không có gì để thêm.