Supposons que j'ai la macro suivante: 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)
6 Réponses :
Ce n'est pas exactement ce que vous demandez, mais cela peut aider.
Vous pouvez : P> #undef code> une macro avant de lui donner une nouvelle définition. P>
#ifdef xxx
#undef xxx
#endif
#define xxx(x) whatever
Notez que le bloc #Ifdef code> n'est pas nécessaire. Vous pouvez utiliser
#undef code> 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 code> puis
#define xxx ... code>.
@James McNellis: Bon à savoir. Merci!
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. P>
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. Ma recommandation est la définition d'un xxx2 code> macro. P>
Notez que le bloc #Ifdef code> n'est pas nécessaire. Vous pouvez utiliser
#undef code> 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 code> puis
#define xxx ... code>.
Frais! Ne savait pas à ce sujet. Laissant hors du #ifdef code> 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.
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); } }
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: p> dans un certain fichier permet une version améliorée de la macro "xxx": p>
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.