2012-04-15 79 views
13

假设在很久以前,我已经创建了以下枚举:如何声明一个枚举值作为的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

可能重复[C++的将枚举值标记为已弃用?](http://stackoverflow.com/questions/5488057/c-mark-enum-value-as-deprecated) – lpapp 2013-10-31 20:10:49

回答

17

我认为你将__attribute__位附加到赋值运算符的错误一侧。这似乎很好地工作:

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    GeometricSquare __attribute__((deprecated)) = GeometricRectangle, 
    GeometricCircle 
}GeometricFigures; 

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

int fig = GeometricSquare; //'GeometricSquare' is deprecated 
+0

非常简单,非常感谢 - 完美的作品。 – Till 2012-04-15 20:57:47

+0

使用它时要小心:在上面的例子中,它完美地工作,因为等于大小写是前一个(rawValue = 2),所以'GeometricSquare'也被赋值为2,并且circle是2 + 1 = 3。但是,假设我们有'GeometricSquare = GeometricPoint'。然后两者都会有一个rawValue = 0,而Objective-C会分配0 + 1 = 1来圈选。然而,'GeometricLine'也是1,导致了'GeometricCircle = GeometricLine'的意外结果。 – Gobe 2017-05-06 19:31:11

+0

是的,他们需要彼此相邻。 – 2017-05-07 23:14:18

12

在以后某个时候加入一个方便的宏:

typedef NS_ENUM(NSInteger, GeometricFigures) 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    GeometricSquare __deprecated_enum_msg("Squares are for squares. Use GeometricRectangle.") = GeometricRectangle, 
    GeometricCircle, 
}; 
+0

不错,很高兴知道! – Till 2015-11-30 16:17:48