如何在NetBC中声明枚举值为弃用(2.0)

Til*_*ill 15 enums objective-c deprecated

假设很久以前,我创建了以下枚举:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricSquare,
   GeometricRectangle,
   GeometricCircle
}GeometricFigures;
Run Code Online (Sandbox Code Playgroud)

我刚才在我令人敬畏的引擎中介绍了这些内容,现在我终于决定不再使用人GeometricSquare了,因为已经覆盖了GeometricRectangle.

首先,我可能会将枚举更改为以下内容:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare = GeometricRectangle,
   GeometricCircle
}GeometricFigures;
Run Code Online (Sandbox Code Playgroud)

这肯定会使我的真棒引擎向后兼容,但另一方面会增加传统垃圾.因此,我想GeometricSquare在可预见的将来完全删除.为了让我的引擎用户明白这一点,我想将其标记GeometricSquare为已弃用.

我的目标是文档(doxygen)以及代码完成(Xcode)以及最后但并非最不重要的编译器(GCC)将使用户明显GeometricSquare不再使用并且已被替换GeometricRectangle.

对于文档,我只想使用@deprecated关键字;

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   ///@deprecated Has been replaced by GeometricRectangle
   GeometricSquare = GeometricRectangle,
   GeometricCircle
}GeometricFigures;
Run Code Online (Sandbox Code Playgroud)

但Xcode和GCC怎么样?

不幸的是,通常的GCC(方法)属性似乎没有完成这项工作.添加 __attribute__((deprecated))如下所示会导致语法错误.

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare = GeometricRectangle __attribute__((deprecated)),
Run Code Online (Sandbox Code Playgroud)

Parse Issue Expected}

   GeometricCircle
}GeometricFigures;
Run Code Online (Sandbox Code Playgroud)

很明显,要么完全不起作用,要么我只是错误地使用它.

Jos*_*ell 19

我认为你将这个__attribute__位附加到赋值运算符的错误一边.这似乎工作正常:

typedef enum
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare __attribute__((deprecated)) = GeometricRectangle,
   GeometricCircle
}GeometricFigures;
Run Code Online (Sandbox Code Playgroud)

现在分配GeometricSquare给出一个编译器警告:

int fig = GeometricSquare;    //'GeometricSquare' is deprecated
Run Code Online (Sandbox Code Playgroud)


Ben*_*ynn 16

稍后,添加了一个便利宏:

typedef NS_ENUM(NSInteger, GeometricFigures)
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare __deprecated_enum_msg("Squares are for squares. Use GeometricRectangle.") = GeometricRectangle,
   GeometricCircle,
};
Run Code Online (Sandbox Code Playgroud)