2012-04-15 4 views
13

vor langer Zeit Angenommen, ich die folgende Aufzählung erstellt hatte:Wie ein ENUM-Wert als in Objective veraltet erklären (2.0)

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

ich während derjenigediejenigedasjenige vor in meinem ehrfürchtigen Motor und Jetzt habe ich endlich entschieden, dass Leute GeometricSquare nicht mehr verwenden sollten, da dies bereits von GeometricRectangle abgedeckt wird.

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

die sicherlich meinen genial Motor rückwärtskompatibel, aber auf der anderen Seite erhöht das Erbe Junk halten würde:

Für den Anfang würde ich vielleicht meine Aufzählung zu so etwas wie dies ändern. Daher möchte ich in absehbarer Zeit GeometricSquare insgesamt entfernen. Um dies den Benutzern meiner Engine zu verdeutlichen, möchte ich GeometricSquare als veraltet markieren.

Mein Ziel ist es, dass die Dokumentation (doxygen) sowie die Code-Vervollständigung (Xcode) und nicht zuletzt der Compiler (GCC) dem Benutzer verdeutlichen, dass GeometricSquare nicht mehr verwendet werden sollte und ersetzt wurde von GeometricRectangle.

Für die Dokumentation würde ich einfach @deprecated Schlüsselwort verwenden;

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

Aber wie wäre es mit Xcode und GCC?

Leider scheint das übliche GCC (Methode) Attribut nicht die Aufgabe zu erfüllen. Das Hinzufügen von __attribute__((deprecated)) wie unten entworfen verursacht einen Syntaxfehler.

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

Parse Ausgabe Erwartet}

GeometricCircle 
}GeometricFigures; 

So offensichtlich, dass entweder nicht ganz funktioniert oder ich bin einfach falsch verwenden.

+1

möglich Duplikat [C++ Mark enum Wert als veraltet?] (http://stackoverflow.com/questions/5488057/c-mark-enum-value-as-deprecated) – lpapp

Antwort

17

Ich denke, dass Sie das __attribute__ Bit an die falsche Seite des Zuweisungsoperators anfügen. Dies scheint gut zu funktionieren:

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

und jetzt GeometricSquare gibt Warnung einen Compiler zuweisen:

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

So einfach, vielen Dank - funktioniert ganz gut. – Till

+0

Seien Sie vorsichtig, wenn Sie das verwenden: Im obigen Beispiel funktioniert es perfekt, weil der Gleichheitsfall der unmittelbar vorhergehende ist (rawValue = 2), also wird 'GeometricSquare' ebenfalls 2 zugewiesen, und Kreis ist 2 + 1 = 3. Nehmen wir an, wir hätten 'GeometricSquare = GeometricPoint'. Dann hätten beide einen rawValue = 0 und Objective-C würde 0 + 1 = 1 dem Kreis zuweisen."GeometricLine" ist jedoch ebenfalls 1, was zu dem unerwarteten Ergebnis "GeometricCircle = GeometricLine" führt. – Gobe

+0

Ja, sie müssen nebeneinander sein. –

12

Zu einem späteren Zeitpunkt ein Convenience-Makro wurde hinzugefügt:

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

Schön, gut zu wissen! – Till

Verwandte Themen