En C ++ 14, puede marcar una función como obsoleta utilizando el [[deprecated]]
atributo (consulte la sección 7.6.5 [dcl.attr.deprecated]).
El token de atributo deprecated
se puede usar para marcar nombres y entidades cuyo uso todavía está permitido, pero se desaconseja por alguna razón.
Por ejemplo, la siguiente función foo
está en desuso:
[[deprecated]]
void foo(int);
Es posible proporcionar un mensaje que describa por qué el nombre o la entidad quedaron en desuso:
[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);
El mensaje debe ser un literal de cadena.
Para obtener más detalles, consulte "Marcado como obsoleto en C ++ 14" .
Esto debería funcionar:
Sin embargo, encontrará problemas si un tipo de retorno de función tiene una coma en su nombre, por ejemplo,
std::pair<int, int>
ya que el preprocesador interpretará que pasa 2 argumentos a la macro DEPRECATED. En ese caso, debería escribir el tipo de retorno.Editar: versión más simple (pero posiblemente menos compatible) aquí .
fuente
__declspec(deprecated)
ahora, por lo que la macro se puede simplificar.Aquí hay una versión simplificada de mi respuesta de 2008 :
Ver también:
__declspec(deprecated)
__attribute__((deprecated))
__attribute__((deprecated))
fuente
[[deprecate]]
tus macros en desuso? :-)DEPRECATED void foo(...);
lugar deDEPRECATED(void foo(...));
En GCC puede declarar su función con el atributo en desuso de esta manera:
Esto activará una advertencia en tiempo de compilación cuando esa función se use en un archivo .c.
Puede encontrar más información en "Pragmas de diagnóstico" en http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html
fuente
Aquí hay una respuesta más completa para 2018.
En la actualidad, muchas herramientas le permiten no solo marcar algo como obsoleto, sino también enviar un mensaje. Esto le permite informar a las personas cuando algo ha quedado en desuso, y tal vez señalarles hacia un reemplazo.
Todavía hay mucha variedad en el soporte del compilador:
[[deprecated]]
/[[deprecated(message)]]
.__attribute__((deprecated))
es compatible con GCC 4.0+ y ARM 4.1+__attribute__((deprecated))
y__attribute__((deprecated(message)))
es compatible con:__GNUC__
/__GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)__GNUC__
/__GNUC_MINOR__
simplemente lo configuran a cualquier versión de GCC instalada)__declspec(deprecated)
desde 13.10 (Visual Studio 2003)__declspec(deprecated(message))
desde 14.0 (Visual Studio 2005)También puede usar
[[gnu::deprecated]]
en versiones recientes de clang en C ++ 11, basado en__has_cpp_attribute(gnu::deprecated)
.Tengo algunas macros en Hedley para manejar todo esto automáticamente, que mantengo actualizado, pero la versión actual (v2) se ve así:
Lo dejaré como un ejercicio para descubrir cómo deshacerse de las macros
*_VERSION_CHECK
y*_HAS_ATTRIBUTE
si no desea usar Hedley (escribí Hedley en gran parte para no tener que pensar en eso regularmente).Si usa GLib, puede usar las macros
G_DEPRECATED
yG_DEPRECATED_FOR
. No son tan robustos como los de Hedley, pero si ya usa GLib no hay nada que agregar.fuente
Al tratar con proyectos portátiles, es casi inevitable que en algún momento necesite una sección de alternativas preprocesadas para una gama de plataformas. #ifdef esto #ifdef eso y así sucesivamente.
En dicha sección, podría definir condicionalmente una forma de desaprobar los símbolos. Por lo general, prefiero definir una macro de "advertencia" ya que la mayoría de las cadenas de herramientas admiten advertencias de compilación personalizadas. Luego, puede continuar con una macro de advertencia específica para desaprobación, etc. Para las plataformas que admiten métodos de desaprobación específicos, puede usar eso en lugar de advertencias.
fuente
Para Intel Compiler v19.0, use esto como
__INTEL_COMPILER
evalúa para1900
:Funciona para los siguientes niveles de idioma:
Intel Compiler tiene lo que parece un error, ya que no admite el
[[deprecated]]
atributo en ciertos elementos del lenguaje que todos los demás compiladores. Por ejemplo, compile v6.0.0 de la biblioteca (notablemente excelente) {fmtlib / fmt} en GitHub con Intel Compiler v19.0. Se romperá Luego vea la solución en la confirmación de GitHub .fuente
__attribute__((deprecated))
, OTOH, funciona en C y C ++ desde al menos ICC 13.0, probablemente mucho más (Intel tiende a no documentar este tipo de cosas, así que no puedo estar seguro).