Comment déprécier une macro dans GCC?

Je sais comment utiliser un atsortingbut obsolète pour déconseiller une fonction comme celle-ci:

int old_fn () __atsortingbute__ ((deprecated)); 

Mais comment déprécier une macro comme celle-ci:

 #define OLD_MACRO 1 

Merci d’avance.

Eric

Solution élégante et élégante, cependant, en fonction de l’activation de C99 (fonctionne avec gcc 4.8.2 ou version ultérieure, non testé sur les versions précédentes):

 #define DEPRECATED_MACRO1 _Pragma ("GCC warning \"'DEPRECATED_MACRO1' macro is deprecated\"") 7 #define DEPRECATED_MACRO2(...) _Pragma ("GCC warning \"'DEPRECATED_MACRO2' macro is deprecated\"") printf(__VA_ARGS__) int main(int argc, char*argv[]) { int n = DEPRECATED_MACRO1; DEPRECATED_MACRO2("%d\n", n); return 0; } 

Je pense que le mieux que vous puissiez faire est quelque chose comme ceci:

 #ifdef USE_DEPRECATED_MACROS #warning using deprecated macros #define OLD_MACRO 1 ... #endif 

De cette façon, vous forcez l’utilisateur à append, par exemple, -DUSE_DEPRECATED_MACROS à leurs options de compilateur et un avertissement est émis.

Vous pouvez vous assurer que ces macros se développeraient pour inclure quelque chose qui inclurait une expression qui déclencherait l’avertissement d’ atsortingbut ((obsolète)).

Ceci est assez facile pour les macros de type fonction (en particulier avec l’opérateur de virgule), mais pour les macros à définition constante ou non standard, cela peut s’avérer plus compliqué, car le contexte dans lequel elles se développent est différent. Je pense que tu pourrais faire:

 #define DEPRECATE(name) static inline void __atsortingbute__((deprecated)) deprecate_ ## name (void) { ; } ... #define MAX(x, y) (DEPRECATE(MAX), x>y?x:y) // yeah, yeah, it repeats args in the body, but it's just an example 

Pour une définition de constante, vous voulez probablement supposer que le corps doit être évalué sans avoir à générer de code, par exemple à l’extérieur d’un corps de fonction, dans les cibles d’un commutateur / cas ou en tant que valeur initiale d’une variable statique dans une fonction .

C’est délicat, mais vous pouvez le faire pour beaucoup de choses.

J’aimerais que C ait un __builtin_warn (const char *) qui fonctionne au niveau du compilateur (pas de préprocesseur) et facilite les choses de ce genre.

modifier

Pour la définition constante, vous pouvez faire:

 #define THREE (DEPRICATED(THREE),3) 

Comme les macros ne font pas partie du compilateur (elles constituent une fonction de pré-processeur), il n’existe aucun moyen propre de le faire. Au mieux, placez vos macros obsolètes dans un nouveau fichier d’en-tête rempli de #warnings. Bien sûr, cela rompra le code existant, mais c’est un moyen de garantir l’attention scope à la dépréciation.