(2.0)

2012-04-15 15 views
13

uzun zaman önce varsayalım, ben yaratmıştı aşağıdaki numaralandırma:(2.0)

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

benim müthiş motoru içinde bir süre önce bu tanıttı ve Şimdi nihayet, insanların zaten GeometricRectangle kapsamında olduğu için GeometricSquare kullanmamasına karar verdim.

Başlangıç ​​için, muhtemelen böyle bir şey doğru benim numaralandırma değiştirecek: kesinlikle benim müthiş motorunu geriye uyumlu tutmak ama diğer taraftan eski önemsiz artıracağını

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

. Bu nedenle, öngörülebilir bir gelecekte GeometricSquare'u kaldırmak istiyorum. Bunu motorumun kullanıcılarına açık yapmak için, GeometricSquare'u kullanımdan kaldırılmış olarak işaretlemek istiyorum.

Amacım, belgelerin (doxygen) yanı sıra kod tamamlama (Xcode) ve son fakat en az değil, derleyici (GCC) kullanıcı için GeometricSquare artık kullanılmamasını ve değiştirilmemesi gerektiğini açıkça ortaya koymasıdır. GeometricRectangle.

Belgeler için @deprecated anahtar sözcüğünü kullanıyorum;

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    ///@deprecated Has been replaced by GeometricRectangle 
    GeometricSquare = GeometricRectangle, 
    GeometricCircle 
}GeometricFigures; 

Xcode ve GCC'ye ne dersiniz?

Ne yazık ki, her zamanki GCC (yöntem) özniteliği işi yapmıyor gibi görünüyor. Aşağıda gösterildiği gibi __attribute__((deprecated)) eklemek, bir sözdizimi hatasına neden olur. Beklenen

typedef enum 
{ 
    GeometricPoint, 
    GeometricLine, 
    GeometricRectangle, 
    GeometricSquare = GeometricRectangle __attribute__((deprecated)), 

Ayrıştırma Sayı }

GeometricCircle 
}GeometricFigures; 

Yani belli bu da tamamen çalışmaz ya da ben sadece yanlış kullanıyorum.

+1

olası yinelenen [C++ enum değerini onaylanmadı olarak işaretleyin?] (http://stackoverflow.com/questions/5488057/c-mark-enum-value-as-deprecated) – lpapp

cevap

17

Sanırım, __attribute__ bitini, atanan işlevin yanlış tarafına takıyorsunuz.

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

ve şimdi GeometricSquare atama bir derleyici uyarı verir:

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

Çok basit, çok teşekkürler - mükemmel çalışıyor. – Till

+0

Bunu kullanırken dikkatli olun: Yukarıdaki örnekte mükemmel çalışır çünkü eşit durumda bir önceki öncekidir (rawValue = 2); böylece “GeometricSquare” 2'ye de atanır ve daire 2 + 1 = 3'tür. Ancak, diyelim ki 'GeometricSquare = GeometricPoint' vardı. Sonra her ikisi de bir rawValue = 0 olur ve Objective-C 0 + 1 = 1'i atayacaktır.Ancak 'GeometricLine' da 1'dir, beklenmedik sonuca 'GeometricCircle = GeometricLine' yol açar. – Gobe

+0

Evet, yan yana olmalılar. –

12

sonraki bir noktada bir kolaylık makro eklendi: Bu çok iyi çalışıyor görünüyor

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

Güzel, bilmek güzel - ty! – Till