Как пометить что-то в Qt как устаревшее (устарело)?
Есть ли Q_OBSOLETE или Q_DEPRECATED в C++ с Qt 4.7?
Или есть подобный макрос C++ или ключевое слово?
6 ответов
Под "устаревшими конструкциями" подразумевается "устаревшие функции-члены". Вы просите предупреждения во время компиляции, чтобы привлечь ваше внимание к сайту вызова любой устаревшей функции.
Это невозможно каким-либо разумным способом в стандартном C++, и я не вижу в G++ атрибутов, которые бы поддерживали это. Qt не может добавить такую функцию, если компилятор уже не поддерживает ее.
Тем не менее, Microsoft Visual C++ поддерживает __declspec(deprecated)
расширение, и я думаю, что можно написать плагин компилятора для G++ 4.5, который добавляет аналогичную функцию.
Если вы используете Q_DECL_DEPRECATED, вы должны получить результат, который вы ищете, например:
Q_DECL_DEPRECATED void foo();
- Вытащите реальную функцию из публичного поля.
- Создайте еще одну функцию с тем же именем в общедоступной области.
- Вставьте свой код предупреждения / ошибки в эту функцию.
- Назовите оригинал с новым.
Просто используйте
#warning
директива
хотя это не стандарт C++, очень маловероятно, что вы встретите компилятор, который его не поддерживает ( см. этот вопрос ТАК).
Возможно, вы захотите сделать что-то похожее на себя:
#ifdef Q_TREAT_OBSOLETE_AS_ERRORS
#define Q_OBSOLETE(X) \
BOOST_STATIC_ASSERT(false); \
X
#else
#define Q_OBSOLETE(X) X
#endif
Эта конструкция просто заменяет некоторый устаревший код / часть кода, если нет Q_TREAT_OBSOLETE_AS_ERRORS
определяется и генерирует ошибку времени компиляции в противном случае.
Обратите внимание, что BOOST_STATIC_ASSERT
не имеет ограничений по объему, так что Q_OBSOLETE
макро.
Вероятно, это не лучший способ решить вашу проблему, и на самом деле я не уверен, что это полезно.
Вы можете просто пометить код как @obsolete
или просто укажите это в комментариях.
2023:
Да, Qt определенQ_DEPRECATED
иQ_DEPRECATED_X
макросы для этого:
Q_DEPRECATED void myOldFunc();
Q_DEPRECATED_X("use myNewFunc instead") void myOldFunc2();
разница только в текстовом сообщении.
Также C++14 представляет[[deprecated("text")]]
атрибут как стандарт. Кажется, что этот атрибут используется скрытно, если вы используете C++ 14+.