Используйте history.pushState ()
из HTML 5 History API
ссылайтесь на ссылку для более подробной информации API истории HTML5
В C ++ 14 вы можете пометить функцию как устаревшую, используя атрибут [[deprecated]]
(см. раздел 7.6.5 [dcl.attr.deprecated]).
атрибут-токен
blockquote>deprecated
может использоваться для обозначения имен и сущностей, использование которых по-прежнему разрешено, но почему-то не рекомендуется.Например, следующая функция
foo
устарел:[[deprecated]] void foo(int);
Можно предоставить сообщение, в котором описывается, почему имя или объект устарели:
[[deprecated("Replaced by bar, which has an improved interface")]] void foo(int);
Сообщение должно быть строковым литералом.
Для получения дополнительной информации см. «Маркировка как устаревшая в C ++ 14» .
В GCC вы можете объявить свою функцию атрибутом, устаревшим следующим образом:
void myfunc() __attribute__ ((deprecated));
Это вызовет предупреждение времени компиляции, когда эта функция используется в файле .c.
Вы можете найти дополнительную информацию в разделе «Диагностические прагмы» в http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html
Это должно сделать трюк:
#ifdef __GNUC__
#define DEPRECATED(func) func __attribute__ ((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED(func) __declspec(deprecated) func
#else
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
#define DEPRECATED(func) func
#endif
...
//don't use me any more
DEPRECATED(void OldFunc(int a, float b));
//use me instead
void NewFunc(int a, double b);
Однако вы столкнетесь с проблемами, если тип возвращаемой функции имеет запятую в своем имени, например. std::pair<int, int>
, так как это будет интерпретироваться препроцессором, передавая 2 аргумента макросу DEPRECATED. В этом случае вам придется напечатать тип возврата.
Изменить: более простая (но, возможно, менее совместимая) версия здесь .
__declspec(deprecated)
, поэтому макрос можно упростить.
– bames53
29 November 2012 в 19:06
Вот упрощенная версия моего ответа 2008 :
#if defined(__GNUC__) || defined(__clang__)
#define DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED __declspec(deprecated)
#else
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
#define DEPRECATED
#endif
//...
//don't use me any more
DEPRECATED void OldFunc(int a, float b);
//use me instead
void NewFunc(int a, double b);
См. также:
DEPRECATED void foo(...);
вместо DEPRECATED(void foo(...));
– dshepherd
25 January 2016 в 18:25
Вот более полный ответ за 2018 год.
В наши дни многие инструменты позволяют не просто отмечать что-то как устаревшее, но также предоставлять сообщение. Это позволяет вам сообщать людям, когда что-то устарело, и, возможно, указывать им на замену.
В поддержке компилятора все еще много разнообразия:
[[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+ __declspec(deprecated)
с 13.10 (Visual Studio 2003) __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, добавить нечего.
Работа с портативными проектами почти неизбежна, что вам в какой-то момент нужен раздел предварительно обработанных альтернатив для ряда платформ. #ifdef это #ifdef и т. д.
В таком разделе вы вполне можете условно определить способ обесценивания символов. Мое предпочтение обычно заключается в определении макроса «предупреждения», поскольку большинство программных цепочек поддерживают специальные предупреждения компилятора. Затем вы можете использовать специальный предупреждающий макрос для отмены и т. Д. Для платформ, поддерживающих специальные методы устаревания, вы можете использовать это вместо предупреждений.