Как объявить значение перечисления как устаревшее в ObjectiveC (2.0)
Предположим, что давным-давно я создал следующее перечисление:
typedef enum
{
GeometricPoint,
GeometricLine,
GeometricSquare,
GeometricRectangle,
GeometricCircle
}GeometricFigures;
Я ввел это в свое время в своем потрясающем движке, и теперь я решил, что люди больше не должны использовать GeometricSquare
, поскольку это уже покрыто GeometricRectangle
.
Для начала я мог бы изменить свое перечисление на что-то вроде этого:
typedef enum
{
GeometricPoint,
GeometricLine,
GeometricRectangle,
GeometricSquare = GeometricRectangle,
GeometricCircle
}GeometricFigures;
Это, безусловно, сохранит мой потрясающий двигатель обратно совместимым, но, с другой стороны, увеличит устаревший мусор. Поэтому я хотел бы удалить GeometricSquare
в целом в обозримом будущем. Чтобы сделать это очевидным для пользователей моего движка, я хотел бы отметить GeometricSquare
как устаревший.
Моя цель заключается в том, что документация (doxygen), а также завершение кода (Xcode) и последнее, но не менее важное место в компиляторе (GCC) сделают очевидным для пользователя, что GeometricSquare
больше не нужно использовать и заменяется на GeometricRectangle
.
Для документации я бы просто использовал ключевое слово @deprecated
;
typedef enum
{
GeometricPoint,
GeometricLine,
GeometricRectangle,
///@deprecated Has been replaced by GeometricRectangle
GeometricSquare = GeometricRectangle,
GeometricCircle
}GeometricFigures;
Но как насчет Xcode и GCC?
К сожалению, обычный атрибут GCC (метод), похоже, не выполняет эту работу. Добавление __attribute__((deprecated))
, как показано ниже, вызывает синтаксическую ошибку.
typedef enum
{
GeometricPoint,
GeometricLine,
GeometricRectangle,
GeometricSquare = GeometricRectangle __attribute__((deprecated)),
Проблема с парсером Ожидаемый}
GeometricCircle
}GeometricFigures;
Таким образом, очевидно, что либо не работает вообще, либо я просто использую его неправильно.
Ответы
Ответ 1
Я думаю, вы прикрепляете бит __attribute__
к неправильной стороне оператора присваивания. Кажется, это нормально работает:
typedef enum
{
GeometricPoint,
GeometricLine,
GeometricRectangle,
GeometricSquare __attribute__((deprecated)) = GeometricRectangle,
GeometricCircle
}GeometricFigures;
и теперь присвоение GeometricSquare
дает предупреждение компилятора:
int fig = GeometricSquare; //'GeometricSquare' is deprecated
Ответ 2
В более поздний момент был добавлен удобный макрос:
typedef NS_ENUM(NSInteger, GeometricFigures)
{
GeometricPoint,
GeometricLine,
GeometricRectangle,
GeometricSquare __deprecated_enum_msg("Squares are for squares. Use GeometricRectangle.") = GeometricRectangle,
GeometricCircle,
};