172 votes

Marque de C++ comme obsolète


J'ai une méthode dans une interface que je veux rendre caduque avec portable C++. Quand j'ai Googlé pour tout cela que j'ai eu était un Microsoft solution spécifique. (http://msdn.microsoft.com/en-us/library/c8xdzzhh(SV.80).aspx et http://msdn.microsoft.com/en-us/library/044swk7y(SV.80).aspx)

Un deuxième prix de la solution serait de ifdef un MSVC et GCC solution.
Merci

235voto

Joseph Mansfield Points 59346

Dans le projet de C++14 (octobre 2013), vous pouvez marquer une fonction comme obsolète à l'aide de l' [[deprecated]] d'attribut (voir la section 7.6.5 [dcl.attr.obsolète]).

L' attribut-jeton deprecated peut être utilisée pour marquer les noms et les entités dont l'utilisation est encore autorisé, mais il est déconseillé pour une raison quelconque.

Par exemple, la fonction suivante foo est obsolète:

[[deprecated]]
void foo(int);

Il est possible de fournir un message qui explique pourquoi le nom ou l'entité était obsolète:

[[deprecated("Replaced by bar, which has an improved interface")]]
void foo(int);

Le message doit être une chaîne littérale.

131voto

Michael Platings Points 1240

Cela devrait faire l'affaire:

 #ifdef __GNUC__
#define DEPRECATED(func) func __attribute__ ((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED(func) __declspec(deprecated) func
#else
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
#define DEPRECATED(func) func
#endif

...

//don't use me any more
DEPRECATED(void OldFunc(int a, float b));

//use me instead
void NewFunc(int a, double b);
 

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 transmettant 2 arguments à la macro DEPRECATED. Dans ce cas, vous devrez saisir le type de retour.

Edit: version plus simple (mais peut-être moins largement compatible) ici .

68voto

Michael Platings Points 1240

Voici une version simplifiée de ma réponse de 2008 :

 #ifdef __GNUC__
#define DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define DEPRECATED __declspec(deprecated)
#else
#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
#define DEPRECATED
#endif

//...

//don't use me any more
DEPRECATED void OldFunc(int a, float b);

//use me instead
void NewFunc(int a, double b);
 

23voto

Terje Mikal Points 763

Dans GCC, vous pouvez déclarer votre fonction avec l’attribut déconseillé comme ceci :

Cela déclenche un avertissement de compilation lorsque cette fonction est utilisée dans un fichier .c.

Vous pouvez trouver plus d’informations sous « Diagnostic pragmas » à http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html

4voto

sharkin Points 4935

Traiter avec portable projets, il est presque inévitable que vous à un certain point besoin d'une section de la séquence d'alternatives pour une gamme de plates-formes. #ifdef ce #ifdef et ainsi de suite.

Dans cette section vous pourriez très bien conditionnellement définir une façon de déprécier les symboles. Ma préférence est généralement de définir un "avertissement" macro depuis plus toolchains soutien personnalisé avertissements du compilateur. Ensuite, vous pouvez aller sur avec un avertissement de macro pour dépréciation etc. Pour les plates-formes de soutien dédié désapprobation des méthodes que vous pouvez utiliser à la place d'avertissements.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X