В 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» .
Это должно сделать трюк:
Однако вы столкнетесь с проблемами, если тип возвращаемого значения функции будет иметь запятую в имени, например, так
std::pair<int, int>
как это будет интерпретироваться препроцессором как передача 2 аргументов макросу DEPRECATED. В этом случае вам нужно будет определить тип возвращаемого значения.Изменить: более простая (но, возможно, менее широко совместимая) версия здесь .
источник
__declspec(deprecated)
сейчас, поэтому макрос можно упростить.Вот упрощенная версия моего ответа 2008 года :
Смотрите также:
__declspec(deprecated)
__attribute__((deprecated))
__attribute__((deprecated))
источник
[[deprecate]]
твои устаревшие макросы? :-)DEPRECATED void foo(...);
вместо этогоDEPRECATED(void foo(...));
В GCC вы можете объявить вашу функцию с устаревшим атрибутом следующим образом:
Это вызовет предупреждение во время компиляции, когда эта функция используется в файле .c.
Вы можете найти дополнительную информацию в разделе «Диагностические прагмы» по адресу http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html.
источник
Вот более полный ответ на 2018 год.
В наши дни многие инструменты позволяют не только пометить что-то как устаревшее, но и предоставить сообщение. Это позволяет вам сказать людям, когда что-то устарело, и, возможно, указать им на замену.
Поддержка компилятора по-прежнему велика:
[[deprecated]]
/[[deprecated(message)]]
.__attribute__((deprecated))
поддерживается GCC 4.0+ и ARM 4.1+__attribute__((deprecated))
и__attribute__((deprecated(message)))
поддерживается для:__GNUC__
/__GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)__GNUC__
/__GNUC_MINOR__
, они просто устанавливают для него установленную версию GCC)__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) выглядит следующим образом:
Я оставлю его в качестве упражнения , чтобы выяснить , как избавиться от
*_VERSION_CHECK
и*_HAS_ATTRIBUTE
макросы , если вы не хотите использовать Хедли (я писал Хедли в основном , так что я не должен думать о том, что на регулярной основе).Если вы используете GLib, вы можете использовать
G_DEPRECATED
иG_DEPRECATED_FOR
макросы. Они не такие надежные, как у Hedley, но если вы уже используете GLib, добавить нечего.источник
При работе с переносимыми проектами почти неизбежно, что в какой-то момент вам понадобится раздел предварительно обработанных альтернатив для ряда платформ. #ifdef это #ifdef это и так далее.
В таком разделе вы вполне могли бы условно определить способ устаревания символов. Обычно я предпочитаю определять макрос «предупреждение», так как большинство наборов инструментов поддерживают пользовательские предупреждения компилятора. Затем вы можете перейти к определенному макросу предупреждений об устаревании и т. Д. Для платформ, поддерживающих выделенные методы устаревания, вы можете использовать это вместо предупреждений.
источник
Для Intel Compiler v19.0 используйте это,
__INTEL_COMPILER
чтобы оценить1900
:Работает для следующих языковых уровней:
Компилятор Intel имеет ошибку, заключающуюся в том, что он не поддерживает
[[deprecated]]
атрибут некоторых языковых элементов, как это делают все другие компиляторы. Например, скомпилируйте v6.0.0 (замечательно превосходной) библиотеки {fmtlib / fmt} на GitHub с Intel Compiler v19.0. Это сломается. Затем посмотрите исправление в коммите GitHub .источник
__attribute__((deprecated))
OTOH, работает на C и C ++, возвращаясь, по крайней мере, к ICC 13.0, возможно, намного дальше (Intel стремится не документировать подобные вещи, поэтому я не уверен).