No C ++ 14, você pode marcar uma função como obsoleta usando o [[deprecated]]
atributo (consulte a seção 7.6.5 [dcl.attr.deprecated]).
O token de atributo deprecated
pode ser usado para marcar nomes e entidades cujo uso ainda é permitido, mas é desencorajado por algum motivo.
Por exemplo, a seguinte função foo
está obsoleta:
[[deprecated]]
void foo(int);
É possível fornecer uma mensagem que descreva por que o nome ou a entidade foi preterido:
[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);
A mensagem deve ser uma string literal.
Para mais detalhes, consulte “Marcando como Descontinuado no C ++ 14” .
Isso deve fazer o truque:
No entanto, você encontrará problemas se um tipo de retorno de função tiver vírgulas em seu nome, por exemplo,
std::pair<int, int>
pois isso será interpretado pelo pré-processador como passando 2 argumentos para a macro DEPRECATED. Nesse caso, você teria que digitar o tipo de retorno.Editar: versão mais simples (mas possivelmente menos amplamente compatível) aqui .
fonte
__declspec(deprecated)
agora, para que a macro possa ser simplificada.Aqui está uma versão simplificada da minha resposta de 2008 :
Veja também:
__declspec(deprecated)
__attribute__((deprecated))
__attribute__((deprecated))
fonte
[[deprecate]]
suas macros obsoletas? :-)DEPRECATED void foo(...);
em vez deDEPRECATED(void foo(...));
No GCC, você pode declarar sua função com o atributo obsoleto da seguinte forma:
Isso disparará um aviso em tempo de compilação quando essa função é usada em um arquivo .c.
Você pode encontrar mais informações em "Pragmas de diagnóstico" em http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html
fonte
Aqui está uma resposta mais completa para 2018.
Atualmente, muitas ferramentas permitem não apenas marcar algo como obsoleto, mas também fornecer uma mensagem. Isso permite que você diga às pessoas quando algo foi descontinuado e talvez as aponte para uma substituição.
Ainda há muita variedade no suporte ao compilador:
[[deprecated]]
/[[deprecated(message)]]
.__attribute__((deprecated))
é suportado pelo GCC 4.0+ e ARM 4.1+__attribute__((deprecated))
e__attribute__((deprecated(message)))
é suportado por:__GNUC__
/__GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)__GNUC__
/__GNUC_MINOR__
, eles apenas o definem para qualquer versão do GCC instalada)__declspec(deprecated)
desde 13.10 (Visual Studio 2003)__declspec(deprecated(message))
desde 14.0 (Visual Studio 2005)Você também pode usar
[[gnu::deprecated]]
nas versões recentes do clang no C ++ 11, com base em__has_cpp_attribute(gnu::deprecated)
.Eu tenho algumas macros no Hedley para lidar com tudo isso automaticamente, que eu mantenho atualizado, mas a versão atual (v2) é assim:
Vou deixar isso como um exercício para descobrir como se livrar das macros
*_VERSION_CHECK
e*_HAS_ATTRIBUTE
se você não quiser usar o Hedley (eu escrevi o Hedley amplamente para não precisar pensar nisso regularmente).Se você usar GLib, você pode usar o
G_DEPRECATED
eG_DEPRECATED_FOR
macros. Eles não são tão robustos quanto os da Hedley, mas se você já usa o GLib, não há nada a acrescentar.fonte
Lidar com projetos portáteis é quase inevitável que em algum momento você precise de uma seção de alternativas pré-processadas para uma variedade de plataformas. #ifdef isso #ifdef isso e assim por diante.
Nessa seção, você poderia muito bem definir condicionalmente uma maneira de descontinuar os símbolos. Minha preferência é geralmente definir uma macro de "aviso", já que a maioria das cadeias de ferramentas oferece suporte a avisos personalizados do compilador. Em seguida, você pode continuar com uma macro de aviso específica para descontinuação, etc. Para as plataformas que suportam métodos de descontinuação dedicados, você pode usá-lo em vez de avisos.
fonte
Para o Intel Compiler v19.0, use-o como
__INTEL_COMPILER
avaliado para1900
:Funciona para os seguintes níveis de idioma:
O Intel Compiler possui o que parece um bug, pois não suporta o
[[deprecated]]
atributo em certos elementos de linguagem que todos os outros compiladores. Por exemplo, compile a v6.0.0 da biblioteca {fmtlib / fmt} (extraordinariamente excelente) no GitHub com o Intel Compiler v19.0. Isso vai quebrar. Então veja a correção no commit do GitHub .fonte
__attribute__((deprecated))
, OTOH, trabalha em C e C ++ desde pelo menos a ICC 13.0, provavelmente muito mais longe (a Intel tende a não documentar esse tipo de coisa, então não tenho certeza).