Как пометить что-то в 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();
  1. Вытащите реальную функцию из публичного поля.
  2. Создайте еще одну функцию с тем же именем в общедоступной области.
  3. Вставьте свой код предупреждения / ошибки в эту функцию.
  4. Назовите оригинал с новым.

Просто используйте

#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+.

Другие вопросы по тегам