Как пометить что-то в Qt как устаревшее (устарело)? - PullRequest
11 голосов
/ 14 ноября 2010

Есть ли в C ++ Q_OBSOLETE или Q_DEPRECATED с Qt 4.7?

Или есть похожий макрос или ключевое слово C ++?

Ответы [ 5 ]

39 голосов
/ 04 апреля 2012

Если вы используете Q_DECL_DEPRECATED, вы должны получить результат, который вы ищете, например ::

Q_DECL_DEPRECATED void foo();
1 голос
/ 15 ноября 2010
  1. Извлечение реальной функции из публичной области.
  2. Создание другой функции с тем же именем в общедоступной области.
  3. Вставьте в эту функцию свой код предупреждения / ошибки.
  4. Позвоните оригиналу с новым.
1 голос
/ 15 ноября 2010

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

#warning 

Директива

хотя это не стандарт C ++, весьма маловероятно, что вы встретите компилятор, который его не поддерживает ( см. Этот вопрос ).

0 голосов
/ 15 ноября 2010

Под «устаревшими конструкциями» вы на самом деле подразумеваете «устаревшие функции-члены». Вы запрашиваете предупреждение во время компиляции, чтобы привлечь ваше внимание к сайту вызова любой устаревшей функции.

В стандартном C ++ это невозможно каким-либо разумным способом, и я не вижу в G ++ атрибутов, которые бы поддерживали это. Qt не может добавить такую ​​функцию, если компилятор уже не поддерживает ее.

Однако Microsoft Visual C ++ поддерживает расширение __declspec(deprecated), и я думаю, что можно написать плагин компилятора для G ++ 4.5, который добавляет аналогичную функцию.

0 голосов
/ 15 ноября 2010

Возможно, вы захотите сделать что-то похожее:

#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 или просто указать его в комментариях.

...