2010-06-21 11 views
8

Supponiamo che io ho la seguente macro:come ridefinire una macro utilizzando la sua precedente definizione

#define xxx(x) printf("%s\n",x); 

Ora in alcuni file che voglio utilizzare una versione "potenziata" di questa macro senza cambiare il suo nome. La nuova versione esplora la funzionalità della versione originale e fa ancora un po 'di lavoro.

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

Questo naturalmente mi dà avvertimento redefition ma il motivo per cui ho 'xxx' non è stato dichiarato in questo ambito? Come dovrei definirlo correttamente?

EDIT: in base a questo http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html dovrebbe essere possibile

+1

Quella pagina macro autoreferenziali sta descrivendo le regole impedendo la ricorsione infinita della macro sostituzione. Ciò non significa che è possibile definire una macro per indicare più di una cosa. –

risposta

0

Non è esattamente quello che stai chiedendo, ma può aiutare.

È possibile aggiungere una macro a #undef prima di dargli una nuova definizione.

Esempio:

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

ho mai sentito parlare di (o visto) una macro ricorsiva però. Non penso sia possibile.

+2

Si noti che il blocco '# ifdef' non è necessario. Puoi usare '# undef' su un nome per definirlo come una macro, anche se quel nome non è attualmente definito come macro. Quindi, puoi semplicemente '#undef xxx' e poi' #define xxx ... '. –

+0

@James McNellis: Buono a sapersi. Grazie! – ereOn

6

Non possibile. Le macro possono utilizzare altre macro ma utilizzano la definizione disponibile al momento dell'espansione, non il tempo della definizione. E le macro in C e C++ non possono essere ricorsive, quindi il xxx nella nuova macro non è espanso ed è considerato come una funzione.

3

Non sarà possibile riutilizzare la vecchia definizione della macro, ma è possibile annullare la definizione e rendere la nuova definizione. Spero che non sia troppo complicato da copiare e incollare.

#ifdef xxx 
#undef xxx 
#endif 
#define xxx(x) printf("%s\n",x); 

La mia raccomandazione sta definendo una macro xxx2.

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

Si noti che il blocco '# ifdef' non è necessario. Puoi usare '# undef' su un nome per definirlo come una macro, anche se quel nome non è attualmente definito come macro. Quindi, puoi semplicemente '#undef xxx' e poi' #define xxx ... '. –

+0

Fantastico! Non lo sapevo. Lasciando fuori '# ifdef' il codice diventa più leggibile. – Mike

+0

Ho un Project-Prefix.pch in cui imposto i valori di default che sono comuni per le app delle mie app e poi ho Prefix.pch specifico per app per le cose che cambiano. Stavo ricevendo un messaggio di avviso "Macro ridefinizione macro o preprocessore" quando ho ridefinito una macro e non riuscivo a capire come disattivare tale avviso nel pre-processore. #undef PLAY_BUTTON_TITLE e poi #define PLAY_BUTTON_TITLE @ "Start" sopprime l'errore e ridefinisce il pulsante. – JScarry

2

Se conosciamo il tipo di parametro 'x' nella macro 'xxx', possiamo ridefinire la macro usandola in una funzione e quindi definire la macro 'xxx' come questa funzione

definizione originale per la macro 'xxx':

#define xxx(x) printf("xxx %s\n",x); 

In una versione certa make file migliorata del 'xxx' macro:

/* before redefining the "xxx" macro use it in function 
* that will have enhanced version for "xxx" 
*/ 
static inline void __body_xxx(const char *x) 
{ 
    xxx(x); 
    printf("enhanced version\n"); 
} 

#undef xxx 
#define xxx(x) __body_xxx(x) 
Problemi correlati