Чтение SharedPreferences: обновление на OnSharedPreferenceChangeListener или доступ напрямую?

Вот более полный ответ за 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).

У меня есть некоторые макросы в Hedley , чтобы обрабатывать все это автоматически, что я постоянно обновляю, но текущая версия (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 . Они не такие надежные, как у Хедли, но если вы уже используете GLib, добавить нечего.

0
задан Einzig7 13 July 2018 в 13:54
поделиться