2012-04-15 12 views
13

Supongamos hace mucho tiempo, que había creado la siguiente enumeración:Cómo declarar un valor de enumeración que está obsoleto en ObjectiveC (2.0)

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

me introdujeron los de hace un tiempo dentro de mi motor impresionante y ahora finalmente he decidido que la gente ya no debería usar GeometricSquare ya que está cubierto por GeometricRectangle ya.

Para empezar, que posiblemente iba a cambiar mi enumeración hacia algo como esto:

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

que sin duda mantener mi motor impresionante compatible hacia atrás, pero por otro lado aumentar la basura legado. Por lo tanto, me gustaría eliminar GeometricSquare por completo en un futuro previsible. Para que esto sea obvio para los usuarios de mi motor, me gustaría marcar GeometricSquare como obsoleto.

Mi objetivo es que la documentación (doxygen) así como la finalización del código (Xcode) y, por último pero no menos importante, el compilador (GCC) hagan obvio al usuario que GeometricSquare ya no se debe usar y se ha reemplazado por GeometricRectangle.

Para la documentación, simplemente usaría la palabra clave @deprecated;

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

Pero ¿qué tal Xcode y GCC?

Desafortunadamente, el atributo GCC (método) habitual no parece hacer el trabajo. Agregar __attribute__((deprecated)) como se describe a continuación provoca un error de sintaxis.

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

Parse Problema esperada}

GeometricCircle 
}GeometricFigures; 

Así que, obviamente, que, o bien no funciona por completo o simplemente estoy usando mal.

+1

posible duplicado de [C++ ¿marcar el valor enum como obsoleto?] (http://stackoverflow.com/questions/5488057/c-mark-enum-value-as-deprecated) – lpapp

Respuesta

17

Creo que está conectando el bit __attribute__ al lado equivocado del operador de asignación. Esto parece funcionar bien:

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

y ahora la asignación de GeometricSquare da una advertencia del compilador:

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

Tan simple, muchas gracias, funciona perfectamente bien. – Till

+0

Tenga cuidado al usar eso: en el ejemplo anterior funciona perfectamente porque el caso igual es inmediato anterior (valorDeRosa = 2) por lo que 'GeometricSquare' también se asigna a 2, y el círculo es 2 + 1 = 3. Sin embargo, digamos que teníamos 'GeometricSquare = GeometricPoint'. Entonces ambos tendrían un valor bruto = 0, y Objective-C asignaría 0 + 1 = 1 al círculo.Sin embargo, 'GeometricLine' también es 1, lo que lleva al resultado inesperado de que' GeometricCircle = GeometricLine'. – Gobe

+0

Sí, necesitan estar uno al lado del otro. –

12

En un momento posterior se añadió una macro conveniencia:

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

¡Agradable, bueno saberlo! – Till

Cuestiones relacionadas