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 に答える