2010-11-14 19 views
8

¿Hay Q_OBSOLETE o Q_DEPRECATED en C++ con Qt 4.7?¿Cómo marcar algo en Qt como obsoleto (obsoleto)?

¿O hay una macro o palabra clave similar de C++?

+0

¿Qué desea una macro o una palabra clave para hacer tal? – bjoernz

+1

Para emitir una advertencia si las construcciones en desuso se encuentran en uso. Vea http://en.wikipedia.org/wiki/Deprecation para una mejor explicación. –

Respuesta

-2

Por "construcciones en desuso", realmente quiere decir "funciones de miembro obsoletas". Está solicitando una advertencia de tiempo de compilación para llamar su atención sobre el sitio de llamada de cualquier función obsoleta.

Esto no es posible de ninguna manera razonable en C++ estándar, y tampoco veo ningún atributo en G ++ que pueda soportar esto. Qt realmente no puede agregar una característica como esa si el compilador ya no tiene soporte.

Sin embargo, Microsoft Visual C++ admite una extensión __declspec(deprecated), y me imagino que es posible escribir un complemento de compilación para G ++ 4.5 que agrega una característica similar.

+0

Parece que me he saltado '__attribute __ ((obsoleto))' en G ++. –

0

Es posible que desee hacer algo similar a ti mismo:

#ifdef Q_TREAT_OBSOLETE_AS_ERRORS 
#define Q_OBSOLETE(X) \ 
     BOOST_STATIC_ASSERT(false); \ 
     X 

#else 
#define Q_OBSOLETE(X) X 
#endif 

Esta construcción simplemente sustituye un código/parte obsoleta de código si no hay Q_TREAT_OBSOLETE_AS_ERRORS definido y genera error en tiempo de compilación de otra manera.

Tenga en cuenta que BOOST_STATIC_ASSERT no tiene limitaciones de alcance, también lo hace la macro Q_OBSOLETE.

Probablemente esta no es la mejor manera de resolver su problema y, de hecho, no estoy seguro si esto es útil.

Puede simplemente marcar el código como @obsolete o simplemente señalarlo en los comentarios.

+0

Esto no funciona. Esto causará errores de compilación si ** el código en desuso está ** compilado **, se llame o no ese código desde otro lugar. –

+0

@Ken Bueno, es obvio que no tienes forma de comprobar si realmente se llama a algún fragmento de código. Esta afirmación estática simplemente ayuda a llamar la atención sobre la compilación de características obsoletas. * En realidad, todo este material de Q_OBSOLETE me parece bastante innecesario.* –

+0

pregunta (creo) porque está acostumbrado a Java, que puede anotar las funciones como obsoletas, y darle una advertencia de compilación cuando intenta usarlas. –

1

sólo tiene que utilizar la directiva

#warning 

aunque no es C++ estándar es bastante improbable que se encontrará con un compilador que no lo soporta (see this SO question).

+0

Windows/MSVC es un objetivo bastante común con Qt, por lo que tengo que estar en desacuerdo con "bastante improbable". –

1
  1. Ponga la función real fuera del alcance público.
  2. Cree otra función con el mismo nombre en el ámbito público.
  3. Inserte su código de advertencia/falla en esa función.
  4. Llame al original con el nuevo.
+2

No se puede emitir una advertencia de tiempo de compilación de esa manera. –

31

Si utiliza Q_DECL_DEPRECATED que debe obtener el resultado que busca ej .:

Q_DECL_DEPRECATED void foo(); 
+6

esta debería ser la respuesta aceptada. – dom0