10
votes

Comment redéfinir une macro en utilisant sa définition précédente

Supposons que j'ai la macro suivante: xxx pré>

maintenant dans certains fichiers, je souhaite utiliser une version "améliorée" de cette macro sans changer son nom. La nouvelle version explore la fonctionnalité de la version d'origine et fait plus de travail. P>

#define xxx(x) do { xxx(x); yyy(x); } while(0)


1 commentaires

Cette page de macros auto-référentielle décrit les règles empêchant la récursivité infinie du remplacement macro. Cela ne signifie pas que vous pouvez définir une macro pour signifier plus d'une chose.


6 Réponses :


0
votes

Ce n'est pas exactement ce que vous demandez, mais cela peut aider.

Vous pouvez #undef code> une macro avant de lui donner une nouvelle définition. P>

: P>

#ifdef xxx
#undef xxx
#endif
#define xxx(x) whatever


2 commentaires

Notez que le bloc #Ifdef n'est pas nécessaire. Vous pouvez utiliser #undef sur un nom pour l'non révéler comme une macro, même si ce nom n'est pas défini comme une macro. Donc, vous pouvez simplement #undef xxx puis #define xxx ... .


@James McNellis: Bon à savoir. Merci!



6
votes

impossible. Les macros peuvent utiliser d'autres macros mais elles utilisent la définition disponible à l'heure supérieure, pas de temps de définition. Et les macros en C et C ++ ne peuvent pas être récursives, le XXX de votre nouvelle macro n'est pas développé et est considéré comme une fonction.


0 commentaires

4
votes

Vous ne pourrez pas réutiliser l'ancienne définition de la macro, mais vous pouvez l'indéfinir et faire la nouvelle définition. Espérons que ce n'est pas trop compliqué à copier et coller. XXX

Ma recommandation est la définition d'un xxx2 macro. xxx


3 commentaires

Notez que le bloc #Ifdef n'est pas nécessaire. Vous pouvez utiliser #undef sur un nom pour l'non révéler comme une macro, même si ce nom n'est pas défini comme une macro. Donc, vous pouvez simplement #undef xxx puis #define xxx ... .


Frais! Ne savait pas à ce sujet. Laissant hors du #ifdef rend le code plus lisible.


J'ai un projet-préfixe.pch où je définis les paramètres par défaut qui sont communs pour l'application de mes applications, puis ont une application spécifique préfixe.pch pour des choses qui changent. J'avais reçu un avertissement «lexical ou préprocesseur émission de macro redéfini» lorsque j'ai redéfini une macro et que je ne pouvais pas comprendre comment éteindre cet avertissement dans le pré-processeur. #undef play_button_title puis #define play_button_title @ "Démarrer" supprime l'erreur et redéfinit le bouton.



3
votes

Les macros auto-référentielles ne fonctionnent pas du tout:

http://gcc.gnu.org/onlinedocs/cpp/Self_002Dreférential-macros.html#self_002Dreférential-macros p>

Si vous travaillez sur C ++, vous pouvez obtenir les mêmes résultats avec Fonctions de modèle et espaces de noms: P>

template <typename T> void xxx( x ) {
        printf( "%s\n", x );
}

namespace my_namespace {

template <typename T> void xxx( T x ) {
        ::xxx(x);
        ::yyy(x);
}

}


0 commentaires

3
votes

Si nous connaissons le type de paramètre 'X' dans la macro 'xxx', nous pouvons redéfinir la macro en l'utilisant dans une fonction, puis définissez la macro 'xxx' comme cette fonction

Définition originale pour le "XXX" macro: xxx

dans un certain fichier permet une version améliorée de la macro "xxx": xxx


0 commentaires