19

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

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;

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

4

2 回答 2

22

我认为您将__attribute__位附加到赋值运算符的错误一侧。这似乎工作正常:

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

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

int fig = GeometricSquare;    //'GeometricSquare' is deprecated
于 2012-04-15T20:55:38.810 回答
16

稍后添加了一个便利宏:

typedef NS_ENUM(NSInteger, GeometricFigures)
{
   GeometricPoint,
   GeometricLine,
   GeometricRectangle,
   GeometricSquare __deprecated_enum_msg("Squares are for squares. Use GeometricRectangle.") = GeometricRectangle,
   GeometricCircle,
};
于 2015-11-30T03:36:45.360 回答