Подтвердить что ты не робот

Как объявить значение перечисления как устаревшее в 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;

Таким образом, очевидно, что либо не работает вообще, либо я просто использую его неправильно.

4b9b3361

Ответ 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,
};