Устаревшие классы и функции в C ++ 11 [дубликат]

Используйте history.pushState () из HTML 5 History API

ссылайтесь на ссылку для более подробной информации API истории HTML5

124
задан Niall 15 September 2014 в 11:20
поделиться

6 ответов

В C ++ 14 вы можете пометить функцию как устаревшую, используя атрибут [[deprecated]] (см. раздел 7.6.5 [dcl.attr.deprecated]).

атрибут-токен deprecated может использоваться для обозначения имен и сущностей, использование которых по-прежнему разрешено, но почему-то не рекомендуется.

Например, следующая функция foo устарел:

[[deprecated]]
void foo(int);

Можно предоставить сообщение, в котором описывается, почему имя или объект устарели:

[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);

Сообщение должно быть строковым литералом.

Для получения дополнительной информации см. «Маркировка как устаревшая в C ++ 14» .

145
ответ дан Joseph Mansfield 16 August 2018 в 05:35
поделиться
  • 1
    Можете ли вы использовать [[устаревший]] в макросе? – Daniel Ryan 19 November 2015 в 04:20
  • 2
    @ Zammbi Вы должны иметь возможность, поскольку макрос обрабатывается препроцессором перед компиляцией. [[устарело]] должно появиться (и позволить компилятору вывести соответствующие предупреждения), где вычисляется макрос. – Florian Castellane 3 November 2016 в 16:26

В GCC вы можете объявить свою функцию атрибутом, устаревшим следующим образом:

void myfunc() __attribute__ ((deprecated));

Это вызовет предупреждение времени компиляции, когда эта функция используется в файле .c.

Вы можете найти дополнительную информацию в разделе «Диагностические прагмы» в http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html

21
ответ дан bames53 16 August 2018 в 05:35
поделиться

Это должно сделать трюк:

#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. В этом случае вам придется напечатать тип возврата.

Изменить: более простая (но, возможно, менее совместимая) версия здесь .

120
ответ дан Community 16 August 2018 в 05:35
поделиться
  • 1
    Вместо #error было бы лучше #define DEPRECATED (func) func – CesarB 17 November 2008 в 11:41
  • 2
    mxp: Недостаток - это только предупреждение, и поэтому я бы сказал, что предупреждение о том, что оно не поддерживается, - это все, что вам нужно. – Leon Timmermans 17 November 2008 в 16:45
  • 3
    Да, я бы пошел за «#warning, вам нужно реализовать DEPRECATED для этого компилятора» или некоторые из них. Если это невозможно, то швейцар может #define DEPRECATED (FUNC) FUNC и жить без него. – Steve Jessop 17 November 2008 в 17:16
  • 4
    К сожалению, нет стандартного способа вывода предупреждения компиляции в C ++: сообщение P #pragma должно будет сделать. – Michael Platings 17 November 2008 в 19:04
  • 5
    Синтаксис атрибута gcc позволяет теперь атрибуту находиться в тех же местах, что и __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);

См. также:

46
ответ дан Florian Castellane 16 August 2018 в 05:35
поделиться
  • 1
    Как вы [[deprecate]] используете устаревшие макросы? :-) – graham.reeds 13 October 2015 в 12:39
  • 2
    Я не вижу существенной разницы между этими двумя ответами. Почему вы опубликовали его во второй раз? – Tomáš Zato 13 November 2015 в 15:29
  • 3
    Вам не нужно обертывать ее вокруг функции, поэтому она DEPRECATED void foo(...); вместо DEPRECATED(void foo(...)); – dshepherd 25 January 2016 в 18:25
  • 4
    Вы должны были отредактировать свой ответ 2008 года, а не публиковать новый. – ybungalobill 24 July 2016 в 13:38
  • 5
    Это может быть не так широко, как мой другой ответ, поэтому я добавил это отдельно. – Michael Platings 13 October 2016 в 09:04

Вот более полный ответ за 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, добавить нечего.

3
ответ дан nemequ 16 August 2018 в 05:35
поделиться

Работа с портативными проектами почти неизбежна, что вам в какой-то момент нужен раздел предварительно обработанных альтернатив для ряда платформ. #ifdef это #ifdef и т. д.

В таком разделе вы вполне можете условно определить способ обесценивания символов. Мое предпочтение обычно заключается в определении макроса «предупреждения», поскольку большинство программных цепочек поддерживают специальные предупреждения компилятора. Затем вы можете использовать специальный предупреждающий макрос для отмены и т. Д. Для платформ, поддерживающих специальные методы устаревания, вы можете использовать это вместо предупреждений.

4
ответ дан sharkin 16 August 2018 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: