2012-04-10 11 views
5

ho letto alla seguente domanda e la risposta sembra abbastanza chiara: How to concatenate twice with the C preprocessor and expand a macro as in "arg ## _ ## MACRO"?Come concatenare stringhe con il preprocessore C con punti in esse?

Ma cosa succede se variabile ha un punto alla fine?

Sto provando a fare una semplice macro che incrementa i contatori in una struttura a scopo di debug. Posso facilmente farlo anche senza l'aiuto della domanda di cui sopra semplicemente con

#ifdef DEBUG 
#define DEBUG_INC_COUNTER(x) x++ 
#endif 

e chiamarlo

DEBUG_INC_COUNT(debugObj.var1); 

Ma l'aggiunta di "debugObj." ad ogni macro sembra terribilmente ridondante. Tuttavia se provo per concatenare:

#define VARIABLE debugObj. 
#define PASTER(x,y) x ## y++ 
#define EVALUATOR(x,y) PASTER(x,y) 
#define DEBUG_INC_COUNTER(x) EVALUATOR(VARIABLE, x) 
DEBUG_INC_COUNTER(var) 

gcc -E macro.c 

ottengo

macro.c:6:1: error: pasting "." and "var" does not give a valid preprocessing token 

Così come dovrei cambiare questo in modo che

DEBUG_INC_COUNTER(var); 

genera

debugObj.var++; 

?

risposta

5

omettere il ##; questo è necessario solo se vuoi unirti alle stringhe. Poiché gli argomenti non sono stringhe, gli spazi tra loro non contano (debugObj . var1 corrisponde a debugObj.var1).

+0

D'oh! Sono diventato troppo intelligente lì. – Makis

4

Non si deve incollare insieme utilizzando ##, come si può avere debugObj., e var1 come token preprocessore separati.

Il seguente dovrebbe funzionare:

#define DEBUG_INC_COUNTER(x) debugObj.x++ 
+0

La modifica ha cancellato la risposta, inizialmente la risposta di Aaron era più chiara e l'ho accettata prima di vedere la modifica. – Makis

+0

Bene con me ... Buona fortuna! – Lindydancer

Problemi correlati