2012-04-15 1 views
13

は長い時間前に仮定し、私は次の列挙に作成していた:私は私の素晴らしいエンジン内でしばらく前にそれらを導入(2.0)

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricSquare, 
    GeometricRectangle, 
    GeometricCircle 
}GeometricFigures; 

し、今私は最終的に人々がGeometricRectangleで既にカバーされているので、GeometricSquareをもう使用してはならないと決めました。

を開始するために、私はおそらくこのような何かに向けて、私の列挙を変更します:確かに私の 素晴らしいエンジン後方互換性を維持するが、一方で従来のジャンクを増加させる

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の++をenum値を廃止予定とマークしてください。](http://stackoverflow.com/questions/5488057/c-mark-enum-value-as-deprecated) – lpapp

答えて

17

__attribute__ビットを代入演算子の間違った側に付けると思います。

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

、今GeometricSquareを割り当てることコンパイラの警告提供します:

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

とてもシンプルです。ありがとうございます。 – Till

+0

これを使用するときは注意してください:上の例では、等号が直前のもの(rawValue = 2)であり、 'GeometricSquare'も2に割り当てられ、円は2 + 1 = 3であるため完全に機能します。しかし、 'GeometricSquare = GeometricPoint'があったとしましょう。それから、両方ともrawValue = 0を持ち、Objective-Cは円に0 + 1 = 1を割り当てます。しかし、 'GeometricLine'も1であり、' GeometricCircle = GeometricLine'という予期せぬ結果につながります。 – Gobe

+0

はい、お互いに隣り合っている必要があります。 –

12

後の時点で、便利なマクロが追加されました:これは正常に動作するようです

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

ニース、よく知っている - ty! – Till