En C ++ 14, vous pouvez marquer une fonction comme obsolète à l'aide de l' [[deprecated]]
attribut (voir section 7.6.5 [dcl.attr.deprecated]).
Le jeton d'attribut deprecated
peut être utilisé pour marquer les noms et les entités dont l'utilisation est toujours autorisée, mais est déconseillée pour une raison quelconque.
Par exemple, la fonction suivante foo
est obsolète:
[[deprecated]]
void foo(int);
Il est possible de fournir un message décrivant pourquoi le nom ou l'entité est obsolète:
[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);
Le message doit être une chaîne littérale.
Pour plus de détails, consultez «Marquage comme obsolète dans C ++ 14» .
Joseph Mansfield
la source
Cela devrait faire l'affaire:
Cependant, vous rencontrerez des problèmes si un type de retour de fonction a une virgule dans son nom, par exemple
std::pair<int, int>
car cela sera interprété par le préprocesseur comme passant 2 arguments à la macro DEPRECATED. Dans ce cas, vous devrez taperef le type de retour.Edit: version plus simple (mais peut-être moins largement compatible) ici .
la source
__declspec(deprecated)
maintenant, de sorte que la macro peut être simplifiée.Voici une version simplifiée de ma réponse de 2008 :
Voir également:
__declspec(deprecated)
__attribute__((deprecated))
__attribute__((deprecated))
la source
[[deprecate]]
vos macros obsolètes? :-)DEPRECATED void foo(...);
place deDEPRECATED(void foo(...));
Dans GCC, vous pouvez déclarer votre fonction avec l'attribut obsolète comme ceci:
Cela déclenchera un avertissement lors de la compilation lorsque cette fonction est utilisée dans un fichier .c.
Vous pouvez trouver plus d'informations sous "Pragmas de diagnostic" à http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html
la source
Voici une réponse plus complète pour 2018.
De nos jours, de nombreux outils vous permettent non seulement de marquer quelque chose comme obsolète, mais également de fournir un message. Cela vous permet de dire aux gens quand quelque chose est obsolète et peut-être de les diriger vers un remplacement.
Il y a encore beaucoup de variété dans le support du compilateur:
[[deprecated]]
/[[deprecated(message)]]
.__attribute__((deprecated))
est pris en charge par GCC 4.0+ et ARM 4.1+__attribute__((deprecated))
et__attribute__((deprecated(message)))
est pris en charge pour:__GNUC__
/__GNUC_MINOR__
/__GNUC_PATCHLEVEL__
)__GNUC__
/__GNUC_MINOR__
, ils le définissent simplement sur la version de GCC installée)__declspec(deprecated)
depuis 13.10 (Visual Studio 2003)__declspec(deprecated(message))
depuis 14.0 (Visual Studio 2005)Vous pouvez également utiliser
[[gnu::deprecated]]
dans les versions récentes de clang en C ++ 11, basé sur__has_cpp_attribute(gnu::deprecated)
.J'ai quelques macros dans Hedley pour gérer tout cela automatiquement que je tiens à jour, mais la version actuelle (v2) ressemble à ceci:
Je vais laisser comme un exercice pour savoir comment se débarrasser des
*_VERSION_CHECK
et*_HAS_ATTRIBUTE
macros si vous ne voulez pas utiliser Hedley (j'ai écrit Hedley en grande partie pour ne pas avoir à y penser régulièrement).Si vous utilisez GLib, vous pouvez utiliser les macros
G_DEPRECATED
etG_DEPRECATED_FOR
. Ils ne sont pas aussi robustes que ceux de Hedley, mais si vous utilisez déjà GLib, il n'y a rien à ajouter.la source
Gérer des projets portables, il est presque inévitable que vous ayez besoin à un moment donné d'une section d'alternatives prétraitées pour une gamme de plates-formes. #ifdef ceci #ifdef cela et ainsi de suite.
Dans une telle section, vous pourriez très bien définir conditionnellement un moyen de désapprouver les symboles. Ma préférence est généralement de définir une macro "avertissement" car la plupart des chaînes d'outils prennent en charge les avertissements personnalisés du compilateur. Ensuite, vous pouvez continuer avec une macro d'avertissement spécifique pour la dépréciation, etc. Pour les plates-formes prenant en charge des méthodes dépréciées dédiées, vous pouvez l'utiliser à la place des avertissements.
la source
Pour Intel Compiler v19.0, utilisez ceci comme
__INTEL_COMPILER
évalue pour1900
:Fonctionne pour les niveaux de langue suivants:
Le compilateur Intel a ce qui semble être un bogue en ce sens qu'il ne prend pas en charge l'
[[deprecated]]
attribut sur certains éléments de langage comme le font tous les autres compilateurs. Par exemple, compilez la v6.0.0 de la (remarquablement superbe) bibliothèque {fmtlib / fmt} sur GitHub avec Intel Compiler v19.0. Ça va casser. Ensuite, voyez le correctif dans le commit GitHub .la source
__attribute__((deprecated))
, OTOH, fonctionne en C et C ++ depuis au moins ICC 13.0, probablement beaucoup plus loin (Intel a tendance à ne pas documenter ce type de choses donc je ne peux pas être sûr).